IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Changeset 31665


Ignore:
Timestamp:
Jun 22, 2011, 12:36:53 AM (15 years ago)
Author:
eugene
Message:

merged from eam_branches/ipp-20110505: scaled colors

Location:
trunk/Ohana/src/kapa2
Files:
7 edited
1 copied

Legend:

Unmodified
Added
Removed
  • trunk/Ohana/src/kapa2/src/DrawObjects.c

    r31560 r31665  
    55# define FillRectangle(X1,Y1,X2,Y2) (XFillRectangle (graphic->display, graphic->window, graphic->gc, (int)(X1), (int)(Y1), (int)(X2), (int)(Y2)))
    66# define DrawCircle(X,Y,R) (XDrawArc (graphic->display, graphic->window, graphic->gc, (int)(X-R), (int)(Y-R), abs(2*R), abs(2*R), 0, 23040))
     7# 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))
    78
    89# define CONNECT 0
     
    7071  }
    7172
    72   XSetForeground (graphic->display, graphic->gc, graphic->color[object[0].color]);
     73  // negative color values mean "scale color with object.z"
     74  if (object[0].color >= 0) {
     75    XSetForeground (graphic->display, graphic->gc, graphic->color[object[0].color]);
     76  }
    7377
    7478  switch (object[0].style) {
     
    371375  float *x, *y, *z;
    372376  double mxi, mxj, myi, myj, bxi, bxj, byi, byj, bx, by;
    373   int sx, sy, sx1, sy1, sx2, sy2, d, D;
     377  int sx, sy, sx1, sy1, sx2, sy2, ds, dz, D;
    374378 
    375379  mxi = graph[0].axis[0].dfx / (object[0].x1 - object[0].x0);
     
    386390  by = byi + byj;
    387391 
     392  Graphic *graphic = GetGraphic();
     393
    388394  /**** points are scaled by object.z ***/
    389   if (object[0].size < 0) {
    390     d = 0.5 * (graphic->dx + graphic->dy) * 0.01;
    391     x = object[0].x; y = object[0].y; z = object[0].z;
    392 
    393     if (object[0].ptype == 0) { /* filled box */
    394       for (i = 0; i < object[0].Npts; i++) {
    395         if (!(finite(x[i]) && finite(y[i]))) continue;
    396         sx = x[i]*mxi + y[i]*mxj + bx + XCENTER;
    397         sy = x[i]*myi + y[i]*myj + by + YCENTER;
    398         if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
    399             (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy))
    400         {
    401           D = d*z[i];
    402           FillRectangle (sx - D, sy - D, 2*D + 1, 2*D + 1);
    403         }
    404       }
    405     }
    406     if (object[0].ptype == 1) { /* open box */
    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 + XCENTER;
    410         sy = x[i]*myi + y[i]*myj + by + YCENTER;
    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         {
    414           D = d*z[i];
    415           DrawRectangle (sx - D, sy - D, 2*D, 2*D);
    416         }
    417       }
    418     }
    419     if (object[0].ptype == 2) { /* cross */
    420       for (i = 0; i < object[0].Npts; i++) {
    421         if (!(finite(x[i]) && finite(y[i]))) continue;
    422         sx = x[i]*mxi + y[i]*mxj + bx + XCENTER;
    423         sy = x[i]*myi + y[i]*myj + by + YCENTER;
    424         if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
    425             (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy))
    426         {
    427           D = d*z[i];
    428           DrawLine (sx - D, sy, sx + D + 1, sy);
    429           DrawLine (sx, sy - D, sx, sy + D + 1);
    430         }
    431       }
    432     }
    433     if (object[0].ptype == 3) { /* x */
    434       for (i = 0; i < object[0].Npts; i++) {
    435         if (!(finite(x[i]) && finite(y[i]))) continue;
    436         sx = x[i]*mxi + y[i]*mxj + bx + XCENTER;
    437         sy = x[i]*myi + y[i]*myj + by + YCENTER;
    438         if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
    439             (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy))
    440         {
    441           D = d*z[i];
    442           DrawLine (sx - D, sy + D, sx + D + 1, sy - D - 1);
    443           DrawLine (sx - D, sy - D, sx + D + 1, sy + D + 1);
    444         }
    445       }
    446     }
    447     if (object[0].ptype == 4) { /* filled triangle */
    448       XPoint points[4];
    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 + XCENTER;
    452         sy = x[i]*myi + y[i]*myj + by + YCENTER;
    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         {
    456           D = d*z[i];
    457           points[0].x = sx - D;  points[0].y = sy + 0.58*D; 
    458           points[1].x = sx + D;  points[1].y = sy + 0.58*D; 
    459           points[2].x = sx;      points[2].y = sy - 1.15*D; 
    460           points[3].x = sx - D;  points[3].y = sy + 0.58*D; 
    461           XFillPolygon (graphic->display, graphic->window, graphic->gc, points, 4, Convex, CoordModeOrigin);
    462         }
    463       }
    464     }
    465     if (object[0].ptype == 5) { /* open triangle */
    466       for (i = 0; i < object[0].Npts; i++) {
    467         if (!(finite(x[i]) && finite(y[i]))) continue;
    468         sx = x[i]*mxi + y[i]*mxj + bx + XCENTER;
    469         sy = x[i]*myi + y[i]*myj + by + YCENTER;
    470         if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
    471             (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy))
    472         {
    473           D = d*z[i];
    474           DrawLine (sx - D, sy + 0.58*D, sx + D, sy + 0.58*D);
    475           DrawLine (sx + D, sy + 0.58*D, sx,     sy - 1.15*D);
    476           DrawLine (sx,     sy - 1.15*D, sx - D, sy + 0.58*D);
    477         }
    478       }
    479     }
    480     if (object[0].ptype == 6) { /* 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 + XCENTER;
    484         sy = x[i]*myi + y[i]*myj + by + YCENTER;
    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         {
    488           D = d*z[i];
    489           DrawLine (sx, sy, sx - D, sy - 0.58*D);
    490           DrawLine (sx, sy, sx + D, sy - 0.58*D);
    491           DrawLine (sx, sy, sx,     sy + 1.15*D);
    492         }
    493       }
    494     }
    495     if (object[0].ptype == 7) { /* 0 */
    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 + XCENTER;
    499         sy = x[i]*myi + y[i]*myj + by + YCENTER;
    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           D = d*z[i];
    504           DrawCircle (sx, sy, D);
    505         }
    506       }
    507     }
    508     if (object[0].ptype == 8) { /* pentagon */
    509       for (i = 0; i < object[0].Npts; i++) {
    510         if (!(finite(x[i]) && finite(y[i]))) continue;
    511         sx = x[i]*mxi + y[i]*mxj + bx + XCENTER;
    512         sy = x[i]*myi + y[i]*myj + by + YCENTER;
    513         if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
    514             (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy))
    515         {
    516           D = d*z[i];
    517           DrawLine (sx + 0.00*D, sy - 1.00*D, sx + 0.95*D, sy - 0.31*D);
    518           DrawLine (sx + 0.95*D, sy - 0.31*D, sx + 0.58*D, sy + 0.81*D);
    519           DrawLine (sx + 0.58*D, sy + 0.81*D, sx - 0.58*D, sy + 0.81*D);
    520           DrawLine (sx - 0.58*D, sy + 0.81*D, sx - 0.95*D, sy - 0.31*D);
    521           DrawLine (sx - 0.95*D, sy - 0.31*D, sx + 0.00*D, sy - 1.00*D);
    522         }
    523       }
    524     }
    525     if (object[0].ptype == 9) { /* hexagon */
    526       for (i = 0; i < object[0].Npts; i++) {
    527         if (!(finite(x[i]) && finite(y[i]))) continue;
    528         sx = x[i]*mxi + y[i]*mxj + bx + XCENTER;
    529         sy = x[i]*myi + y[i]*myj + by + YCENTER;
    530         if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
    531             (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy))
    532         {
    533           D = d*z[i];
    534           DrawLine (sx -      D, sy,          sx - 0.50*D, sy + 0.87*D);
    535           DrawLine (sx - 0.50*D, sy + 0.87*D, sx + 0.50*D, sy + 0.87*D);
    536           DrawLine (sx + 0.50*D, sy + 0.87*D, sx +      D, sy);
    537 
    538           DrawLine (sx +      D, sy,          sx + 0.50*D, sy - 0.87*D);
    539           DrawLine (sx + 0.50*D, sy - 0.87*D, sx - 0.50*D, sy - 0.87*D);
    540           DrawLine (sx - 0.50*D, sy - 0.87*D, sx -      D, sy);
    541         }
    542       }
    543     }
    544     if (object[0].ptype == 100) {       /* connect a pair of points */
    545 
    546       double X0 = graph[0].axis[0].fx;
    547       double X1 = graph[0].axis[0].fx + graph[0].axis[0].dfx;
    548       double Y0 = graph[0].axis[1].fy;
    549       double Y1 = graph[0].axis[1].fy + graph[0].axis[1].dfy;
    550 
    551       for (i = 0; i + 1 < object[0].Npts; i+=2) {
    552         if (!(finite(x[i]) && finite(y[i]))) continue;
    553         sx1 = x[i]*mxi + y[i]*mxj + bx + XCENTER;
    554         sy1 = x[i]*myi + y[i]*myj + by + YCENTER;
    555         if (!(finite(x[i+1]) && finite(y[i+1]))) continue;
    556         sx2 = x[i+1]*mxi + y[i+1]*mxj + bx + XCENTER;
    557         sy2 = x[i+1]*myi + y[i+1]*myj + by + YCENTER;
    558         ClipLine (sx1, sy1, sx2, sy2, X0, Y0, X1, Y1);
    559       }
    560     }
    561   }
    562   /**** points are not scaled by object.z ***/
    563   /** some rules on how the points are drawn:
    564       1) the smallest point is always a dot (single pixel)
    565       2) the point shape should be invarient on position
    566       3) center of point is always center of a pixel
    567    **/
    568   else {
    569     d = (int)(object[0].size * hypot((float)graphic->dx, (float)graphic->dy) * 0.003);
    570     x = object[0].x; y = object[0].y;
    571 
    572     if (object[0].ptype == 0) { /* filled box : OK */
    573       for (i = 0; i < object[0].Npts; i++) {
    574         if (!(finite(x[i]) && finite(y[i]))) continue;
    575         sx = x[i]*mxi + y[i]*mxj + bx + XCENTER;
    576         sy = x[i]*myi + y[i]*myj + by + YCENTER;
    577         if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
    578             (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy))
    579         {
    580           FillRectangle (sx - d, sy - d, 2*d + 1, 2*d + 1);
    581         }
    582       }
    583     }
    584     if (object[0].ptype == 1) { /* open box : OK*/
    585       for (i = 0; i < object[0].Npts; i++) {
    586         if (!(finite(x[i]) && finite(y[i]))) continue;
    587         sx = x[i]*mxi + y[i]*mxj + bx + XCENTER;
    588         sy = x[i]*myi + y[i]*myj + by + YCENTER;
    589         if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
    590             (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy))
    591         {
    592           DrawRectangle (sx - d, sy - d, 2*d, 2*d);
    593         }
    594       }
    595     }
    596     if (object[0].ptype == 2) { /* cross : OK*/
    597       for (i = 0; i < object[0].Npts; i++) {
    598         if (!(finite(x[i]) && finite(y[i]))) continue;
    599         sx = x[i]*mxi + y[i]*mxj + bx + XCENTER;
    600         sy = x[i]*myi + y[i]*myj + by + YCENTER;
    601         if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
    602             (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy))
    603         {
    604           DrawLine (sx - d, sy, sx + d + 1, sy); // DrawLine does NOT draw the end pixel
    605           DrawLine (sx, sy - d, sx, sy + d + 1);
    606         }
    607       }
    608     }
    609     if (object[0].ptype == 3) { /* x : OK */
    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         {
    617           /* XDrawLine is a little funny, this is needed to fix endpost errors */
    618           DrawLine (sx - d, sy + d, sx + d + 1, sy - d - 1);
    619           DrawLine (sx - d, sy - d, sx + d + 1, sy + d + 1);
    620         }
    621       }
    622     }
    623     if (object[0].ptype == 4) { /* filled triangle */
    624       XPoint points[4];
    625       for (i = 0; i < object[0].Npts; i++) {
    626         if (!(finite(x[i]) && finite(y[i]))) continue;
    627         sx = x[i]*mxi + y[i]*mxj + bx + XCENTER;
    628         sy = x[i]*myi + y[i]*myj + by + YCENTER;
    629         if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
    630             (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy))
    631         {
    632           points[0].x = sx - d;  points[0].y = sy + 0.58*d; 
    633           points[1].x = sx + d;  points[1].y = sy + 0.58*d; 
    634           points[2].x = sx;      points[2].y = sy - 1.15*d; 
    635           points[3].x = sx - d;  points[3].y = sy + 0.58*d; 
    636           XFillPolygon (graphic->display, graphic->window, graphic->gc, points, 4, Convex, CoordModeOrigin);
    637         }
    638       }
    639     }
    640     if (object[0].ptype == 5) { /* open triangle */
    641       for (i = 0; i < object[0].Npts; i++) {
    642         if (!(finite(x[i]) && finite(y[i]))) continue;
    643         sx = x[i]*mxi + y[i]*mxj + bx + XCENTER;
    644         sy = x[i]*myi + y[i]*myj + by + YCENTER;
    645         if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
    646             (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy))
    647         {
    648           DrawLine (sx - d, sy + 0.58*d, sx + d, sy + 0.58*d);
    649           DrawLine (sx + d, sy + 0.58*d, sx,     sy - 1.15*d);
    650           DrawLine (sx,     sy - 1.15*d, sx - d, sy + 0.58*d);
    651         }
    652       }
    653     }
    654     if (object[0].ptype == 6) { /* Y */
    655       for (i = 0; i < object[0].Npts; i++) {
    656         if (!(finite(x[i]) && finite(y[i]))) continue;
    657         sx = x[i]*mxi + y[i]*mxj + bx + XCENTER;
    658         sy = x[i]*myi + y[i]*myj + by + YCENTER;
    659         if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
    660             (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy))
    661         {
    662           DrawLine (sx, sy, sx - d, sy - 0.58*d);
    663           DrawLine (sx, sy, sx + d, sy - 0.58*d);
    664           DrawLine (sx, sy, sx,     sy + 1.15*d);
    665         }
    666       }
    667     }
    668     if (object[0].ptype == 7) { /* 0 */
    669       for (i = 0; i < object[0].Npts; i++) {
    670         if (!(finite(x[i]) && finite(y[i]))) continue;
    671         sx = x[i]*mxi + y[i]*mxj + bx + XCENTER;
    672         sy = x[i]*myi + y[i]*myj + by + YCENTER;
    673         if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
    674             (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy))
    675         {
    676           DrawCircle (sx, sy, d);
    677         }
    678       }
    679     }
    680     if (object[0].ptype == 8) { /* pentagon */
    681       for (i = 0; i < object[0].Npts; i++) {
    682         if (!(finite(x[i]) && finite(y[i]))) continue;
    683         sx = x[i]*mxi + y[i]*mxj + bx + XCENTER;
    684         sy = x[i]*myi + y[i]*myj + by + YCENTER;
    685         if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
    686             (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy))
    687         {
    688           DrawLine (sx + 0.00*d, sy - 1.00*d, sx + 0.95*d, sy - 0.31*d);
    689           DrawLine (sx + 0.95*d, sy - 0.31*d, sx + 0.58*d, sy + 0.81*d);
    690           DrawLine (sx + 0.58*d, sy + 0.81*d, sx - 0.58*d, sy + 0.81*d);
    691           DrawLine (sx - 0.58*d, sy + 0.81*d, sx - 0.95*d, sy - 0.31*d);
    692           DrawLine (sx - 0.95*d, sy - 0.31*d, sx + 0.00*d, sy - 1.00*d);
    693         }
    694       }
    695     }
    696     if (object[0].ptype == 9) { /* pentagon */
    697       for (i = 0; i < object[0].Npts; i++) {
    698         if (!(finite(x[i]) && finite(y[i]))) continue;
    699         sx = x[i]*mxi + y[i]*mxj + bx + XCENTER;
    700         sy = x[i]*myi + y[i]*myj + by + YCENTER;
    701         if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
    702             (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy))
    703         {
    704           DrawLine (sx - 1.00*d, sy + 0.00*d, sx - 0.50*d, sy + 0.87*d);
    705           DrawLine (sx - 0.50*d, sy + 0.87*d, sx + 0.50*d, sy + 0.87*d);
    706           DrawLine (sx + 0.50*d, sy + 0.87*d, sx + 1.00*d, sy + 0.00*d);
    707           DrawLine (sx + 1.00*d, sy + 0.00*d, sx + 0.50*d, sy - 0.87*d);
    708           DrawLine (sx + 0.50*d, sy - 0.87*d, sx - 0.50*d, sy - 0.87*d);
    709           DrawLine (sx - 0.50*d, sy - 0.87*d, sx - 1.00*d, sy + 0.00*d);
    710         }
    711       }
    712     }
    713     if (object[0].ptype == 100) {       
    714       double X0 = graph[0].axis[0].fx;
    715       double X1 = graph[0].axis[0].fx + graph[0].axis[0].dfx;
    716       double Y0 = graph[0].axis[1].fy;
    717       double Y1 = graph[0].axis[1].fy + graph[0].axis[1].dfy;
    718 
    719       for (i = 0; i + 1 < object[0].Npts; i+=2) {
    720         if (!(finite(x[i]) && finite(y[i]))) continue;
    721         sx1 = x[i]*mxi + y[i]*mxj + bx + XCENTER;
    722         sy1 = x[i]*myi + y[i]*myj + by + YCENTER;
    723         sx2 = x[i+1]*mxi + y[i+1]*mxj + bx + XCENTER;
    724         sy2 = x[i+1]*myi + y[i+1]*myj + by + YCENTER;
    725         ClipLine (sx1, sy1, sx2, sy2, X0, Y0, X1, Y1);
    726       }
     395  int scaleSize = (object[0].size < 0);
     396  int scaleColor = (object[0].color < 0);
     397
     398  ds = 0.5 * (graphic->dx + graphic->dy) * 0.003 * object[0].size;
     399  dz = 0.5 * (graphic->dx + graphic->dy) * 0.010;
     400  x = object[0].x; y = object[0].y; z = object[0].z;
     401
     402  if (object[0].ptype == 0) {   /* filled box */
     403    for (i = 0; i < object[0].Npts; i++) {
     404      if (!(finite(x[i]) && finite(y[i]))) continue;
     405      sx = x[i]*mxi + y[i]*mxj + bx + XCENTER;
     406      sy = x[i]*myi + y[i]*myj + by + YCENTER;
     407      if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
     408          (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy)) {
     409        if (scaleColor) {
     410          int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
     411          XSetForeground (graphic->display, graphic->gc, graphic->cmap[pixel].pixel);
     412        }
     413        D = scaleSize ? dz*z[i] : ds;
     414        FillRectangle (sx - D, sy - D, 2*D + 1, 2*D + 1);
     415      }
     416    }
     417  }
     418  if (object[0].ptype == 1) {   /* open box */
     419    for (i = 0; i < object[0].Npts; i++) {
     420      if (!(finite(x[i]) && finite(y[i]))) continue;
     421      sx = x[i]*mxi + y[i]*mxj + bx + XCENTER;
     422      sy = x[i]*myi + y[i]*myj + by + YCENTER;
     423      if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
     424          (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy)) {
     425        if (scaleColor) {
     426          int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
     427          XSetForeground (graphic->display, graphic->gc, graphic->cmap[pixel].pixel);
     428        }
     429        D = scaleSize ? dz*z[i] : ds;
     430        DrawRectangle (sx - D, sy - D, 2*D, 2*D);
     431      }
     432    }
     433  }
     434  if (object[0].ptype == 2) { /* cross */
     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          int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
     443          XSetForeground (graphic->display, graphic->gc, graphic->cmap[pixel].pixel);
     444        }
     445        D = scaleSize ? dz*z[i] : ds;
     446        DrawLine (sx - D, sy, sx + D + 1, sy);
     447        DrawLine (sx, sy - D, sx, sy + D + 1);
     448      }
     449    }
     450  }
     451  if (object[0].ptype == 3) {   /* x */
     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          int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
     460          XSetForeground (graphic->display, graphic->gc, graphic->cmap[pixel].pixel);
     461        }
     462        D = scaleSize ? dz*z[i] : ds;
     463        DrawLine (sx - D, sy + D, sx + D + 1, sy - D - 1);
     464        DrawLine (sx - D, sy - D, sx + D + 1, sy + D + 1);
     465      }
     466    }
     467  }
     468  if (object[0].ptype == 4) {   /* filled triangle */
     469    XPoint points[4];
     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          int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
     478          XSetForeground (graphic->display, graphic->gc, graphic->cmap[pixel].pixel);
     479        }
     480        D = scaleSize ? dz*z[i] : ds;
     481        points[0].x = sx - D;  points[0].y = sy + 0.58*D; 
     482        points[1].x = sx + D;  points[1].y = sy + 0.58*D; 
     483        points[2].x = sx;      points[2].y = sy - 1.15*D; 
     484        points[3].x = sx - D;  points[3].y = sy + 0.58*D; 
     485        XFillPolygon (graphic->display, graphic->window, graphic->gc, points, 4, Convex, CoordModeOrigin);
     486      }
     487    }
     488  }
     489  if (object[0].ptype == 5) {   /* open triangle */
     490    for (i = 0; i < object[0].Npts; i++) {
     491      if (!(finite(x[i]) && finite(y[i]))) continue;
     492      sx = x[i]*mxi + y[i]*mxj + bx + XCENTER;
     493      sy = x[i]*myi + y[i]*myj + by + YCENTER;
     494      if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
     495          (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy)) {
     496        if (scaleColor) {
     497          int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
     498          XSetForeground (graphic->display, graphic->gc, graphic->cmap[pixel].pixel);
     499        }
     500        D = scaleSize ? dz*z[i] : ds;
     501        DrawLine (sx - D, sy + 0.58*D, sx + D, sy + 0.58*D);
     502        DrawLine (sx + D, sy + 0.58*D, sx,     sy - 1.15*D);
     503        DrawLine (sx,     sy - 1.15*D, sx - D, sy + 0.58*D);
     504      }
     505    }
     506  }
     507  if (object[0].ptype == 6) {   /* Y */
     508    for (i = 0; i < object[0].Npts; i++) {
     509      if (!(finite(x[i]) && finite(y[i]))) continue;
     510      sx = x[i]*mxi + y[i]*mxj + bx + XCENTER;
     511      sy = x[i]*myi + y[i]*myj + by + YCENTER;
     512      if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
     513          (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy)) {
     514        if (scaleColor) {
     515          int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
     516          XSetForeground (graphic->display, graphic->gc, graphic->cmap[pixel].pixel);
     517        }
     518        D = scaleSize ? dz*z[i] : ds;
     519        DrawLine (sx, sy, sx - D, sy - 0.58*D);
     520        DrawLine (sx, sy, sx + D, sy - 0.58*D);
     521        DrawLine (sx, sy, sx,     sy + 1.15*D);
     522      }
     523    }
     524  }
     525  if (object[0].ptype == 7) {   /* 0 */
     526    for (i = 0; i < object[0].Npts; i++) {
     527      if (!(finite(x[i]) && finite(y[i]))) continue;
     528      sx = x[i]*mxi + y[i]*mxj + bx + XCENTER;
     529      sy = x[i]*myi + y[i]*myj + by + YCENTER;
     530      if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
     531          (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy)) {
     532        if (scaleColor) {
     533          int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
     534          XSetForeground (graphic->display, graphic->gc, graphic->cmap[pixel].pixel);
     535        }
     536        D = scaleSize ? dz*z[i] : ds;
     537        DrawCircle (sx, sy, D);
     538      }
     539    }
     540  }
     541  if (object[0].ptype == 8) {   /* pentagon */
     542    for (i = 0; i < object[0].Npts; i++) {
     543      if (!(finite(x[i]) && finite(y[i]))) continue;
     544      sx = x[i]*mxi + y[i]*mxj + bx + XCENTER;
     545      sy = x[i]*myi + y[i]*myj + by + YCENTER;
     546      if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
     547          (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy)) {
     548        if (scaleColor) {
     549          int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
     550          XSetForeground (graphic->display, graphic->gc, graphic->cmap[pixel].pixel);
     551        }
     552        D = scaleSize ? dz*z[i] : ds;
     553        DrawLine (sx + 0.00*D, sy - 1.00*D, sx + 0.95*D, sy - 0.31*D);
     554        DrawLine (sx + 0.95*D, sy - 0.31*D, sx + 0.58*D, sy + 0.81*D);
     555        DrawLine (sx + 0.58*D, sy + 0.81*D, sx - 0.58*D, sy + 0.81*D);
     556        DrawLine (sx - 0.58*D, sy + 0.81*D, sx - 0.95*D, sy - 0.31*D);
     557        DrawLine (sx - 0.95*D, sy - 0.31*D, sx + 0.00*D, sy - 1.00*D);
     558      }
     559    }
     560  }
     561  if (object[0].ptype == 9) {   /* hexagon */
     562    for (i = 0; i < object[0].Npts; i++) {
     563      if (!(finite(x[i]) && finite(y[i]))) continue;
     564      sx = x[i]*mxi + y[i]*mxj + bx + XCENTER;
     565      sy = x[i]*myi + y[i]*myj + by + YCENTER;
     566      if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
     567          (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy)) {
     568        if (scaleColor) {
     569          int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
     570          XSetForeground (graphic->display, graphic->gc, graphic->cmap[pixel].pixel);
     571        }
     572        D = scaleSize ? dz*z[i] : ds;
     573        DrawLine (sx -      D, sy,          sx - 0.50*D, sy + 0.87*D);
     574        DrawLine (sx - 0.50*D, sy + 0.87*D, sx + 0.50*D, sy + 0.87*D);
     575        DrawLine (sx + 0.50*D, sy + 0.87*D, sx +      D, sy);
     576
     577        DrawLine (sx +      D, sy,          sx + 0.50*D, sy - 0.87*D);
     578        DrawLine (sx + 0.50*D, sy - 0.87*D, sx - 0.50*D, sy - 0.87*D);
     579        DrawLine (sx - 0.50*D, sy - 0.87*D, sx -      D, sy);
     580      }
     581    }
     582  }
     583  if (object[0].ptype == 10) {  /* filled 0 */
     584    for (i = 0; i < object[0].Npts; i++) {
     585      if (!(finite(x[i]) && finite(y[i]))) continue;
     586      sx = x[i]*mxi + y[i]*mxj + bx + XCENTER;
     587      sy = x[i]*myi + y[i]*myj + by + YCENTER;
     588      if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
     589          (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy)) {
     590        if (scaleColor) {
     591          int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
     592          XSetForeground (graphic->display, graphic->gc, graphic->cmap[pixel].pixel);
     593        }
     594        D = scaleSize ? dz*z[i] : ds;
     595        FillCircle (sx, sy, D);
     596      }
     597    }
     598  }
     599  if (object[0].ptype == 100) { /* connect a pair of points */
     600
     601    double X0 = graph[0].axis[0].fx;
     602    double X1 = graph[0].axis[0].fx + graph[0].axis[0].dfx;
     603    double Y0 = graph[0].axis[1].fy;
     604    double Y1 = graph[0].axis[1].fy + graph[0].axis[1].dfy;
     605
     606    for (i = 0; i + 1 < object[0].Npts; i+=2) {
     607      if (!(finite(x[i]) && finite(y[i]))) continue;
     608      sx1 = x[i]*mxi + y[i]*mxj + bx + XCENTER;
     609      sy1 = x[i]*myi + y[i]*myj + by + YCENTER;
     610      if (!(finite(x[i+1]) && finite(y[i+1]))) continue;
     611      sx2 = x[i+1]*mxi + y[i+1]*mxj + bx + XCENTER;
     612      sy2 = x[i+1]*myi + y[i+1]*myj + by + YCENTER;
     613      ClipLine (sx1, sy1, sx2, sy2, X0, Y0, X1, Y1);
    727614    }
    728615  }
  • trunk/Ohana/src/kapa2/src/LoadObject.c

    r29539 r31665  
    3838                      graph[0].objects[N].lweight, graph[0].objects[N].size);
    3939 
    40   /* force valid ranges */
    41   if ((graph[0].objects[N].color > KapaColormapSize()) || (graph[0].objects[N].color < 0))
    42     graph[0].objects[N].color = 0;
     40  // limit color ranges (negative is allowed for ptype == 2 --> color scaled by z
     41  if (graph[0].objects[N].color >= KapaColormapSize()) {
     42      graph[0].objects[N].color = KapaColormapSize() - 1;
     43  }
     44  if ((graph[0].objects[N].style != 2) && (graph[0].objects[N].color < 0)) {
     45      graph[0].objects[N].color = 0;
     46  }
    4347
    4448  KiiScanMessage (sock, "%lf %lf %lf %lf",
     
    6468    REALLOCATE (graph[0].objects, Gobjects, MAX (1, graph[0].Nobjects));
    6569  }
    66   if (graph[0].objects[N].size < 0.0) {
     70  if ((graph[0].objects[N].size < 0.0) || (graph[0].objects[N].color < 0.0)) {
    6771    if (!LoadVectorData (sock, graph, N, "z")) {
    6872      FreeObjectData (&graph[0].objects[N]);
  • trunk/Ohana/src/kapa2/src/PNGit.c

    r29938 r31665  
    11# include "Ximage.h"
    2 
    3 /* I almost have PNG images + plots working.  I need to do a few more things:
    4    1) decide on the dimensions of the output image/plot file -- like the jpeg covering the pixels? adjust the box to include the full plot box?
    5    2) update bDraw to either write palette values (as now) or RGB values into the buffer
    6    3) decision on output based on the existence of images or not
    7 */
    82
    93int PNGcommand (int sock) {
     
    2216  png_structp png_ptr;
    2317  png_infop info_ptr;
    24   int i, status, Npalette, Nsection;
     18  int status, Npalette;
    2519  bDrawBuffer *buffer = NULL;
    2620  Graphic *graphic = NULL;
    2721  png_color *palette = NULL;
    28   Section *section;
    2922
    3023  graphic = GetGraphic();
     
    6861  palette = KapaPNGPalette (&Npalette);
    6962
     63  /* before we allowed colormap-scaled points, we had the option of writing an image using a
     64     limited palette.  we could get smart and check all objects to see if any of them use
     65     scaled colors and choose a limited palette if not. but maybe that is not worth the effort.
     66  */
     67
     68# if (0)
    7069  // do we have an image in any of the sections?
    71   Nsection = GetNumberOfSections ();
     70  int Nsection = GetNumberOfSections ();
    7271  int haveImage = FALSE;
     72  int i;
    7373  for (i = 0; !haveImage && (i < Nsection); i++) {
    74     section = GetSectionByNumber (i);
     74    Section *section = GetSectionByNumber (i);
    7575    haveImage = (section->image != NULL);
    7676  }
     77# else
     78  int haveImage = TRUE;
     79# endif
    7780
    7881  /* see docs for write-row-callback to provide progress info */
    7982  if (haveImage) {
    80     // png_set_IHDR (png_ptr, info_ptr, graphic->dx, graphic->dy, 16, PNG_COLOR_TYPE_RGB, PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT);
    8183    png_set_IHDR (png_ptr, info_ptr, graphic->dx, graphic->dy, 8, PNG_COLOR_TYPE_RGB, PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT);
    8284    png_set_sRGB (png_ptr, info_ptr, PNG_sRGB_INTENT_ABSOLUTE);
     
    9597  if (haveImage) {
    9698    buffer = bDrawIt (palette, Npalette, 3);
    97     // bDrawImage (buffer, graphic);
    9899  } else {
    99100    buffer = bDrawIt (palette, Npalette, 1);
  • trunk/Ohana/src/kapa2/src/PSObjects.c

    r31560 r31665  
    22
    33# define DrawLine(X1,Y1,X2,Y2) (fprintf (f, " %6.2f %6.2f %6.2f %6.2f L\n", X1, graphic->dy - Y1, X2, graphic->dy - Y2))
    4 # define DrawCircle(X1,Y1,R) (fprintf (f, " %6.2f %6.2f %6.2f C\n", (X1), (graphic->dy - Y1), (R)))
    54# define DrawRectangle(X,Y,dX,dY) (fprintf (f, " %6.2f %6.2f %6.2f %6.2f B\n", (dX), (dY), (X-0.5*dX), (graphic->dy-Y-0.5*dY)))
    65# define FillRectangle(X,Y,dX,dY) (fprintf (f, " %6.2f %6.2f %6.2f %6.2f F\n", (dX), (dY), (X-0.5*dX), (graphic->dy-Y-0.5*dY)))
     6# define DrawCircle(X1,Y1,R) (fprintf (f, " %6.2f %6.2f %6.2f C\n", (X1), (graphic->dy - Y1), (R)))
     7# define FillCircle(X1,Y1,R) (fprintf (f, " %6.2f %6.2f %6.2f FC\n", (X1), (graphic->dy - Y1), (R)))
    78# 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)))
    89# define CONNECT 0
     
    3738    lweight = MAX (0, MIN (10, graph[0].objects[i].lweight));
    3839    fprintf (f, "%.1f setlinewidth\n", lweight);
    39     fprintf (f, "%s setrgbcolor\n", KapaColorRGBString(graph[0].objects[i].color));
     40
     41    if (graph[0].objects[i].color >= 0) {
     42        fprintf (f, "%s setrgbcolor\n", KapaColorRGBString(graph[0].objects[i].color));
     43    }
    4044
    4145    switch (graph[0].objects[i].style) {
     
    270274  float *x, *y, *z;
    271275  double mxi, mxj, myi, myj, bxi, bxj, byi, byj, bx, by;
    272   double sx, sy, d, sx1, sy1, sx2, sy2, X0, Y0, X1, Y1;
     276  double sx, sy, sx1, sy1, sx2, sy2, ds, dz, D;
     277  float *pixel1, *pixel2, *pixel3;
    273278
    274279  mxi = graph[0].axis[0].dfx / (object[0].x1 - object[0].x0);
     
    285290  by = byi + byj;
    286291 
    287   /* below here, code is identical with DrawObjects */
     292  Graphic *graphic = GetGraphic();
     293
     294  ALLOCATE (pixel1, float, graphic[0].Npixels);
     295  ALLOCATE (pixel2, float, graphic[0].Npixels);
     296  ALLOCATE (pixel3, float, graphic[0].Npixels);
     297
     298  /** cmap[i].pixel must be defined even if X is not used **/
     299  for (i = 0; i < graphic[0].Npixels; i++) { /* set up pixel array */
     300    pixel1[i] = graphic[0].cmap[i].red / (float) 0xffff;
     301    pixel2[i] = graphic[0].cmap[i].green / (float) 0xffff;
     302    pixel3[i] = graphic[0].cmap[i].blue / (float) 0xffff;
     303  }
     304
     305  // black, I think
     306  // fprintf (f, "0.00 0.00 0.00 setrgbcolor\n");
     307
    288308  /**** points are scaled by object.z ***/
    289   if (object[0].size < 0) {
    290     d = 0.5 * (graphic->dx + graphic->dy) * 0.01;
    291     x = object[0].x; y = object[0].y; z = object[0].z;
    292     if (object[0].ptype == 0) { /* filled box */
    293       for (i = 0; i < object[0].Npts; i++) {
    294         if (!(finite(x[i]) && finite(y[i]))) continue;
    295         sx = x[i]*mxi + y[i]*mxj + bx;
    296         sy = x[i]*myi + y[i]*myj + by;
    297         if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
    298             (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy))
    299           {
    300             FillRectangle (sx, sy, 2*d*z[i], 2*d*z[i]);
    301           }
    302       }
    303     }
    304     if (object[0].ptype == 1) { /* 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           {
    312             DrawRectangle (sx, sy, 2*d*z[i], 2*d*z[i]);
    313           }
    314       }
    315     }
    316     if (object[0].ptype == 2) { /* cross */
    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             DrawLine (sx - d*z[i], sy, sx + d*z[i], sy);
    325             DrawLine (sx, sy - d*z[i], sx, sy + d*z[i]);
    326           }
    327       }
    328     }
    329     if (object[0].ptype == 3) { /* x */
    330       for (i = 0; i < object[0].Npts; i++) {
    331         if (!(finite(x[i]) && finite(y[i]))) continue;
    332         sx = x[i]*mxi + y[i]*mxj + bx;
    333         sy = x[i]*myi + y[i]*myj + by;
    334         if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
    335             (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy))
    336           {
    337             DrawLine (sx + d*z[i], sy - d*z[i], sx - d*z[i], sy + d*z[i]);
    338             DrawLine (sx - d*z[i], sy - d*z[i], sx + d*z[i], sy + d*z[i]);
    339           }
    340       }
    341     }
    342     if (object[0].ptype == 4) { /* filled triangle */
    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             FillTriangle (sx - d*z[i], sy - 0.58*d*z[i], sx + d*z[i], sy - 0.58*d*z[i], sx, sy + 1.15*d*z[i]);
    351             /*
    352             DrawLine (sx - d*z[i], sy + 0.58*d*z[i], sx + d*z[i], sy + 0.58*d*z[i]);
    353             DrawLine (sx + d*z[i], sy + 0.58*d*z[i], sx,          sy - 1.15*d*z[i]);
    354             DrawLine (sx,          sy - 1.15*d*z[i], sx - d*z[i], sy + 0.58*d*z[i]);
    355             */
    356           }
    357       }
    358     }
    359     if (object[0].ptype == 5) { /* open triangle */
    360       for (i = 0; i < object[0].Npts; i++) {
    361         if (!(finite(x[i]) && finite(y[i]))) continue;
    362         sx = x[i]*mxi + y[i]*mxj + bx;
    363         sy = x[i]*myi + y[i]*myj + by;
    364         if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
    365             (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy))
    366           {
    367             DrawLine (sx - d*z[i], sy - 0.58*d*z[i], sx + d*z[i], sy - 0.58*d*z[i]);
    368             DrawLine (sx + d*z[i], sy - 0.58*d*z[i], sx,          sy + 1.15*d*z[i]);
    369             DrawLine (sx,          sy + 1.15*d*z[i], sx - d*z[i], sy - 0.58*d*z[i]);
    370           }
    371       }
    372     }
    373     if (object[0].ptype == 6) { /* Y */
    374       for (i = 0; i < object[0].Npts; i++) {
    375         if (!(finite(x[i]) && finite(y[i]))) continue;
    376         sx = x[i]*mxi + y[i]*mxj + bx;
    377         sy = x[i]*myi + y[i]*myj + by;
    378         if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
    379             (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy))
    380           {
    381             DrawLine (sx, sy, sx - d*z[i], sy + 0.58*d*z[i]);
    382             DrawLine (sx, sy, sx + d*z[i], sy + 0.58*d*z[i]);
    383             DrawLine (sx, sy, sx,          sy - 1.15*d*z[i]);
    384           }
    385       }
    386     }
    387     if (object[0].ptype == 7) { /* 0 */
    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           {
    395             DrawCircle (sx, sy, d*z[i]);
    396           }
    397       }
    398     }
    399     if (object[0].ptype == 8) { /* pentagon */
    400       for (i = 0; i < object[0].Npts; i++) {
    401         if (!(finite(x[i]) && finite(y[i]))) continue;
    402         sx = x[i]*mxi + y[i]*mxj + bx;
    403         sy = x[i]*myi + y[i]*myj + by;
    404         if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
    405             (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy))
    406         {
    407           DrawLine (sx + 0.00*d*z[i], sy + 1.00*d*z[i], sx + 0.95*d*z[i], sy + 0.31*d*z[i]);
    408           DrawLine (sx + 0.95*d*z[i], sy + 0.31*d*z[i], sx + 0.58*d*z[i], sy - 0.81*d*z[i]);
    409           DrawLine (sx + 0.58*d*z[i], sy - 0.81*d*z[i], sx - 0.58*d*z[i], sy - 0.81*d*z[i]);
    410           DrawLine (sx - 0.58*d*z[i], sy - 0.81*d*z[i], sx - 0.95*d*z[i], sy + 0.31*d*z[i]);
    411           DrawLine (sx - 0.95*d*z[i], sy + 0.31*d*z[i], sx + 0.00*d*z[i], sy + 1.00*d*z[i]);
    412         }
    413       }
    414     }
    415     if (object[0].ptype == 9) { /* hexagon */
    416       for (i = 0; i < object[0].Npts; i++) {
    417         if (!(finite(x[i]) && finite(y[i]))) continue;
    418         sx = x[i]*mxi + y[i]*mxj + bx;
    419         sy = x[i]*myi + y[i]*myj + by;
    420         if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
    421             (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy))
    422         {
    423           DrawLine (sx -      d*z[i], sy,               sx - 0.50*d*z[i], sy + 0.87*d*z[i]);
    424           DrawLine (sx - 0.50*d*z[i], sy + 0.87*d*z[i], sx + 0.50*d*z[i], sy + 0.87*d*z[i]);
    425           DrawLine (sx + 0.50*d*z[i], sy + 0.87*d*z[i], sx +      d*z[i], sy);
    426 
    427           DrawLine (sx +      d*z[i], sy,               sx + 0.50*d*z[i], sy - 0.87*d*z[i]);
    428           DrawLine (sx + 0.50*d*z[i], sy - 0.87*d*z[i], sx - 0.50*d*z[i], sy - 0.87*d*z[i]);
    429           DrawLine (sx - 0.50*d*z[i], sy - 0.87*d*z[i], sx -      d*z[i], sy);
    430         }
    431       }
    432     }
    433     if (object[0].ptype == 100) {       /* connect a pair of points */
    434         X0 = graph[0].axis[0].fx;
    435         X1 = graph[0].axis[0].fx + graph[0].axis[0].dfx;
    436         Y0 = graph[0].axis[1].fy;
    437         Y1 = graph[0].axis[1].fy + graph[0].axis[1].dfy;
    438 
    439       for (i = 0; i + 1 < object[0].Npts; i+=2) {
    440         if (!(finite(x[i]) && finite(y[i]))) continue;
    441         sx1 = x[i]*mxi + y[i]*mxj + bx;
    442         sy1 = x[i]*myi + y[i]*myj + by;
    443         sx2 = x[i+1]*mxi + y[i+1]*mxj + bx;
    444         sy2 = x[i+1]*myi + y[i+1]*myj + by;
    445         ClipLinePS (sx1, sy1, sx2, sy2, X0, Y0, X1, Y1, f);
    446       }
    447     }
    448   } else {
    449     d = object[0].size * 0.5 * (graphic->dx + graphic->dy) * 0.003;
    450     x = object[0].x; y = object[0].y;
    451     if (object[0].ptype == 0) { /* filled box */
    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             FillRectangle (sx, sy, 2*d, 2*d);
    460           }
    461       }
    462     }
    463     if (object[0].ptype == 1) {         /* open box */
    464       for (i = 0; i < object[0].Npts; i++) {
    465         if (!(finite(x[i]) && finite(y[i]))) continue;
    466         sx = x[i]*mxi + y[i]*mxj + bx;
    467         sy = x[i]*myi + y[i]*myj + by;
    468         if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
    469             (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy))
    470           {
    471             DrawRectangle (sx, sy, 2*d, 2*d);
    472           }
    473       }
    474     }
    475     if (object[0].ptype == 2) { /* cross */
    476       for (i = 0; i < object[0].Npts; i++) {
    477         if (!(finite(x[i]) && finite(y[i]))) continue;
    478         sx = x[i]*mxi + y[i]*mxj + bx;
    479         sy = x[i]*myi + y[i]*myj + by;
    480         if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
    481             (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy))
    482           {
    483             DrawLine (sx - d, sy, sx + d, sy);
    484             DrawLine (sx, sy - d, sx, sy + d);
    485           }
    486       }
    487     }
    488     if (object[0].ptype == 3) {         /* x */
    489       for (i = 0; i < object[0].Npts; i++) {
    490         if (!(finite(x[i]) && finite(y[i]))) continue;
    491         sx = x[i]*mxi + y[i]*mxj + bx;
    492         sy = x[i]*myi + y[i]*myj + by;
    493         if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
    494             (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy))
    495           {
    496             DrawLine (sx + d, sy - d, sx - d, sy + d);
    497             DrawLine (sx - d, sy - d, sx + d, sy + d);
    498           }
    499       }
    500     }
    501     if (object[0].ptype == 4) { /* filled triangle */
    502       for (i = 0; i < object[0].Npts; i++) {
    503         if (!(finite(x[i]) && finite(y[i]))) continue;
    504         sx = x[i]*mxi + y[i]*mxj + bx;
    505         sy = x[i]*myi + y[i]*myj + by;
    506         if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
    507             (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy))
    508           {
    509             /*
    510             DrawLine (sx - d, sy + 0.58*d, sx + d, sy + 0.58*d);
    511             DrawLine (sx + d, sy + 0.58*d, sx,     sy - 1.15*d);
    512             DrawLine (sx,     sy - 1.15*d, sx - d, sy + 0.58*d);
    513             */
    514             FillTriangle (sx - d, sy - 0.58*d, sx + d, sy - 0.58*d, sx, sy + 1.15*d);
    515           }
    516       }
    517     }
    518     if (object[0].ptype == 5) { /* open triangle */
    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             DrawLine (sx - d, sy - 0.58*d, sx + d, sy - 0.58*d);
    527             DrawLine (sx + d, sy - 0.58*d, sx,     sy + 1.15*d);
    528             DrawLine (sx,     sy + 1.15*d, sx - d, sy - 0.58*d);
    529           }
    530       }
    531     }
    532     if (object[0].ptype == 6) { /* Y */
    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           {
    540             DrawLine (sx, sy, sx - d, sy + 0.58*d);
    541             DrawLine (sx, sy, sx + d, sy + 0.58*d);
    542             DrawLine (sx, sy, sx,     sy - 1.15*d);
    543           }
    544       }
    545     }
    546     if (object[0].ptype == 7) { /* 0 */
    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             DrawCircle (sx, sy, d);
    555           }
    556       }
    557     }
    558     if (object[0].ptype == 8) { /* pentagon */
    559       for (i = 0; i < object[0].Npts; i++) {
    560         if (!(finite(x[i]) && finite(y[i]))) continue;
    561         sx = x[i]*mxi + y[i]*mxj + bx;
    562         sy = x[i]*myi + y[i]*myj + by;
    563         if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
    564             (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy))
    565         {
    566           DrawLine (sx + 0.00*d, sy + 1.00*d, sx + 0.95*d, sy + 0.31*d);
    567           DrawLine (sx + 0.95*d, sy + 0.31*d, sx + 0.58*d, sy - 0.81*d);
    568           DrawLine (sx + 0.58*d, sy - 0.81*d, sx - 0.58*d, sy - 0.81*d);
    569           DrawLine (sx - 0.58*d, sy - 0.81*d, sx - 0.95*d, sy + 0.31*d);
    570           DrawLine (sx - 0.95*d, sy + 0.31*d, sx + 0.00*d, sy + 1.00*d);
    571         }
    572       }
    573     }
    574     if (object[0].ptype == 9) { /* pentagon */
    575       for (i = 0; i < object[0].Npts; i++) {
    576         if (!(finite(x[i]) && finite(y[i]))) continue;
    577         sx = x[i]*mxi + y[i]*mxj + bx;
    578         sy = x[i]*myi + y[i]*myj + by;
    579         if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
    580             (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy))
    581         {
    582           DrawLine (sx - 1.00*d, sy + 0.00*d, sx - 0.50*d, sy + 0.87*d);
    583           DrawLine (sx - 0.50*d, sy + 0.87*d, sx + 0.50*d, sy + 0.87*d);
    584           DrawLine (sx + 0.50*d, sy + 0.87*d, sx + 1.00*d, sy + 0.00*d);
    585           DrawLine (sx + 1.00*d, sy + 0.00*d, sx + 0.50*d, sy - 0.87*d);
    586           DrawLine (sx + 0.50*d, sy - 0.87*d, sx - 0.50*d, sy - 0.87*d);
    587           DrawLine (sx - 0.50*d, sy - 0.87*d, sx - 1.00*d, sy + 0.00*d);
    588         }
    589       }
    590     }
    591     if (object[0].ptype == 100) {       
    592         X0 = graph[0].axis[0].fx;
    593         X1 = graph[0].axis[0].fx + graph[0].axis[0].dfx;
    594         Y0 = graph[0].axis[1].fy;
    595         Y1 = graph[0].axis[1].fy + graph[0].axis[1].dfy;
    596 
    597       for (i = 0; i + 1 < object[0].Npts; i+=2) {
    598         if (!(finite(x[i]) && finite(y[i]))) continue;
    599         sx1 = x[i]*mxi + y[i]*mxj + bx;
    600         sy1 = x[i]*myi + y[i]*myj + by;
    601         sx2 = x[i+1]*mxi + y[i+1]*mxj + bx;
    602         sy2 = x[i+1]*myi + y[i+1]*myj + by;
    603         ClipLinePS (sx1, sy1, sx2, sy2, X0, Y0, X1, Y1, f);
    604       }
    605     }
    606   }
     309  int scaleSize = (object[0].size < 0);
     310  int scaleColor = (object[0].color < 0);
     311
     312  ds = 0.5 * (graphic->dx + graphic->dy) * 0.003 * object[0].size;
     313  dz = 0.5 * (graphic->dx + graphic->dy) * 0.010;
     314  x = object[0].x; y = object[0].y; z = object[0].z;
     315
     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          int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
     326          fprintf (f, "%4.2f %4.2f %4.2f setrgbcolor\n", pixel1[pixel], pixel2[pixel], pixel3[pixel]);
     327        }
     328        D = scaleSize ? dz*z[i] : ds;
     329        FillRectangle (sx, sy, 2*D, 2*D);
     330      }
     331    }
     332  }
     333  if (object[0].ptype == 1) {   /* open box */
     334    for (i = 0; i < object[0].Npts; i++) {
     335      if (!(finite(x[i]) && finite(y[i]))) continue;
     336      sx = x[i]*mxi + y[i]*mxj + bx;
     337      sy = x[i]*myi + y[i]*myj + by;
     338      if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
     339          (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy))
     340      {
     341        if (scaleColor) {
     342          int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
     343          fprintf (f, "%4.2f %4.2f %4.2f setrgbcolor\n", pixel1[pixel], pixel2[pixel], pixel3[pixel]);
     344        }
     345        D = scaleSize ? dz*z[i] : ds;
     346        DrawRectangle (sx, sy, 2*D, 2*D);
     347      }
     348    }
     349  }
     350  if (object[0].ptype == 2) { /* cross */
     351    for (i = 0; i < object[0].Npts; i++) {
     352      if (!(finite(x[i]) && finite(y[i]))) continue;
     353      sx = x[i]*mxi + y[i]*mxj + bx;
     354      sy = x[i]*myi + y[i]*myj + by;
     355      if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
     356          (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy))
     357      {
     358        if (scaleColor) {
     359          int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
     360          fprintf (f, "%4.2f %4.2f %4.2f setrgbcolor\n", pixel1[pixel], pixel2[pixel], pixel3[pixel]);
     361        }
     362        D = scaleSize ? dz*z[i] : ds;
     363        DrawLine (sx - D, sy, sx + D, sy);
     364        DrawLine (sx, sy - D, sx, sy + D);
     365      }
     366    }
     367  }
     368  if (object[0].ptype == 3) {   /* x */
     369    for (i = 0; i < object[0].Npts; i++) {
     370      if (!(finite(x[i]) && finite(y[i]))) continue;
     371      sx = x[i]*mxi + y[i]*mxj + bx;
     372      sy = x[i]*myi + y[i]*myj + by;
     373      if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
     374          (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy))
     375      {
     376        if (scaleColor) {
     377          int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
     378          fprintf (f, "%4.2f %4.2f %4.2f setrgbcolor\n", pixel1[pixel], pixel2[pixel], pixel3[pixel]);
     379        }
     380        D = scaleSize ? dz*z[i] : ds;
     381        DrawLine (sx + D, sy - D, sx - D, sy + D);
     382        DrawLine (sx - D, sy - D, sx + D, sy + D);
     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          int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
     396          fprintf (f, "%4.2f %4.2f %4.2f setrgbcolor\n", pixel1[pixel], pixel2[pixel], pixel3[pixel]);
     397        }
     398        D = scaleSize ? dz*z[i] : ds;
     399        FillTriangle (sx - D, sy - 0.58*D, sx + D, sy - 0.58*D, sx, sy + 1.15*D);
     400        /*
     401          DrawLine (sx - D, sy + 0.58*D, sx + D, sy + 0.58*D);
     402          DrawLine (sx + D, sy + 0.58*D, sx,          sy - 1.15*D);
     403          DrawLine (sx,          sy - 1.15*D, sx - D, sy + 0.58*D);
     404        */
     405      }
     406    }
     407  }
     408  if (object[0].ptype == 5) {   /* 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      {
     416        if (scaleColor) {
     417          int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
     418          fprintf (f, "%4.2f %4.2f %4.2f setrgbcolor\n", pixel1[pixel], pixel2[pixel], pixel3[pixel]);
     419        }
     420        D = scaleSize ? dz*z[i] : ds;
     421        DrawLine (sx - D, sy - 0.58*D, sx + D, sy - 0.58*D);
     422        DrawLine (sx + D, sy - 0.58*D, sx,          sy + 1.15*D);
     423        DrawLine (sx,          sy + 1.15*D, sx - D, sy - 0.58*D);
     424      }
     425    }
     426  }
     427  if (object[0].ptype == 6) {   /* Y */
     428    for (i = 0; i < object[0].Npts; i++) {
     429      if (!(finite(x[i]) && finite(y[i]))) continue;
     430      sx = x[i]*mxi + y[i]*mxj + bx;
     431      sy = x[i]*myi + y[i]*myj + by;
     432      if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
     433          (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy))
     434      {
     435        if (scaleColor) {
     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, sy, sx - D, sy + 0.58*D);
     441        DrawLine (sx, sy, sx + D, sy + 0.58*D);
     442        DrawLine (sx, sy, sx,          sy - 1.15*D);
     443      }
     444    }
     445  }
     446  if (object[0].ptype == 7) {   /* 0 */
     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          int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
     456          fprintf (f, "%4.2f %4.2f %4.2f setrgbcolor\n", pixel1[pixel], pixel2[pixel], pixel3[pixel]);
     457        }
     458        D = scaleSize ? dz*z[i] : ds;
     459        DrawCircle (sx, sy, D);
     460      }
     461    }
     462  }
     463  if (object[0].ptype == 8) {   /* pentagon */
     464    for (i = 0; i < object[0].Npts; i++) {
     465      if (!(finite(x[i]) && finite(y[i]))) continue;
     466      sx = x[i]*mxi + y[i]*mxj + bx;
     467      sy = x[i]*myi + y[i]*myj + by;
     468      if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
     469          (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy))
     470      {
     471        if (scaleColor) {
     472          int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
     473          fprintf (f, "%4.2f %4.2f %4.2f setrgbcolor\n", pixel1[pixel], pixel2[pixel], pixel3[pixel]);
     474        }
     475        D = scaleSize ? dz*z[i] : ds;
     476        DrawLine (sx + 0.00*D, sy + 1.00*D, sx + 0.95*D, sy + 0.31*D);
     477        DrawLine (sx + 0.95*D, sy + 0.31*D, sx + 0.58*D, sy - 0.81*D);
     478        DrawLine (sx + 0.58*D, sy - 0.81*D, sx - 0.58*D, sy - 0.81*D);
     479        DrawLine (sx - 0.58*D, sy - 0.81*D, sx - 0.95*D, sy + 0.31*D);
     480        DrawLine (sx - 0.95*D, sy + 0.31*D, sx + 0.00*D, sy + 1.00*D);
     481      }
     482    }
     483  }
     484  if (object[0].ptype == 9) {   /* hexagon */
     485    for (i = 0; i < object[0].Npts; i++) {
     486      if (!(finite(x[i]) && finite(y[i]))) continue;
     487      sx = x[i]*mxi + y[i]*mxj + bx;
     488      sy = x[i]*myi + y[i]*myj + by;
     489      if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
     490          (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy))
     491      {
     492        if (scaleColor) {
     493          int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
     494          fprintf (f, "%4.2f %4.2f %4.2f setrgbcolor\n", pixel1[pixel], pixel2[pixel], pixel3[pixel]);
     495        }
     496        D = scaleSize ? dz*z[i] : ds;
     497        DrawLine (sx -      D, sy,               sx - 0.50*D, sy + 0.87*D);
     498        DrawLine (sx - 0.50*D, sy + 0.87*D, sx + 0.50*D, sy + 0.87*D);
     499        DrawLine (sx + 0.50*D, sy + 0.87*D, sx +      D, sy);
     500
     501        DrawLine (sx +      D, sy,               sx + 0.50*D, sy - 0.87*D);
     502        DrawLine (sx + 0.50*D, sy - 0.87*D, sx - 0.50*D, sy - 0.87*D);
     503        DrawLine (sx - 0.50*D, sy - 0.87*D, sx -      D, sy);
     504      }
     505    }
     506  }
     507  if (object[0].ptype == 10) {  /* 0 */
     508    for (i = 0; i < object[0].Npts; i++) {
     509      if (!(finite(x[i]) && finite(y[i]))) continue;
     510      sx = x[i]*mxi + y[i]*mxj + bx;
     511      sy = x[i]*myi + y[i]*myj + by;
     512      if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
     513          (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy))
     514      {
     515        if (scaleColor) {
     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        FillCircle (sx, sy, D);
     521      }
     522    }
     523  }
     524  if (object[0].ptype == 100) { /* connect a pair of points */
     525    double X0 = graph[0].axis[0].fx;
     526    double X1 = graph[0].axis[0].fx + graph[0].axis[0].dfx;
     527    double Y0 = graph[0].axis[1].fy;
     528    double Y1 = graph[0].axis[1].fy + graph[0].axis[1].dfy;
     529
     530    for (i = 0; i + 1 < object[0].Npts; i+=2) {
     531      if (!(finite(x[i]) && finite(y[i]))) continue;
     532      sx1 = x[i]*mxi + y[i]*mxj + bx;
     533      sy1 = x[i]*myi + y[i]*myj + by;
     534      sx2 = x[i+1]*mxi + y[i+1]*mxj + bx;
     535      sy2 = x[i+1]*myi + y[i+1]*myj + by;
     536      ClipLinePS (sx1, sy1, sx2, sy2, X0, Y0, X1, Y1, f);
     537    }
     538  }
     539
     540  free (pixel1);
     541  free (pixel2);
     542  free (pixel3);
    607543}
    608544   
  • trunk/Ohana/src/kapa2/src/PSit.c

    r29938 r31665  
    7676  fprintf (f, " 0 exch rlineto -1 mul 0 rlineto closepath fill stroke } def\n");
    7777  fprintf (f, "/C {0 360 arc stroke} def\n");
     78  fprintf (f, "/FC {0 360 arc fill stroke} def\n");
     79  fprintf (f, "/RGB {setrgbcolor} def\n");
    7880  fprintf (f, "/L {newpath moveto lineto stroke} def\n\n");
    7981  fprintf (f, "/TF {newpath moveto lineto lineto fill stroke} def\n\n");
  • trunk/Ohana/src/kapa2/src/SetChannel.c

    r16011 r31665  
    3939  Graphic *graphic;
    4040  Section *section;
    41   KapaImageWidget *image;
    4241  char colormap[256];
    4342  int status;
    4443
     44  KiiScanMessage (sock, "%s", colormap);
     45  status = SetColormap (colormap);
     46  if (!status) {
     47      fprintf (stderr, "unknown colormap %s\n", colormap);
     48      return (TRUE);
     49  }
     50
    4551  graphic = GetGraphic ();
    4652  section = GetActiveSection();
    47   if (section->image == NULL) {
    48     section->image = InitImageWidget ();
    49     SetSectionSizes (section);
     53  if (section->image) {
     54    // section->image = InitImageWidget ();
     55    // SetSectionSizes (section);
     56    // image = section->image;
     57    SetColorScale (graphic, section->image);
     58    if (!USE_XWINDOW) return (TRUE);
     59    Remap (graphic, section->image);
    5060  }
    51   image = section->image;
    5261
    53   KiiScanMessage (sock, "%s", colormap);
    54 
    55   status = SetColormap (colormap);
    56   if (!status) fprintf (stderr, "unknown colormap %s\n", colormap);
    57 
    58   SetColorScale (graphic, image);
    59   if (!USE_XWINDOW) return (TRUE);
    60 
    61   Remap (graphic, image);
    6262  Refresh ();
    6363  XFlush (graphic[0].display);
  • trunk/Ohana/src/kapa2/src/bDrawObjects.c

    r31560 r31665  
    22
    33# define DrawLine(BUF,X1,Y1,X2,Y2) (bDrawLine (BUF, (X1), (Y1), (X2), (Y2)))
    4 # define DrawCircle(BUF,X1,Y1,R) (bDrawCircle (BUF, (X1), (Y1), (R)))
    54# define DrawRectangle(BUF,X,Y,dX,dY) (bDrawRectOpen (BUF, (X-0.5*dX), (Y-0.5*dY), (X+0.5*dX), (Y+0.5*dY)))
    65# define FillRectangle(BUF,X,Y,dX,dY) (bDrawRectFill (BUF, (X-0.5*dX), (Y-0.5*dY), (X+0.5*dX+1), (Y+0.5*dY+1)))
     6# define DrawCircle(BUF,X1,Y1,R) (bDrawCircle (BUF, (X1), (Y1), (R)))
     7# define FillCircle(BUF,X1,Y1,R) (bDrawCircleFill (BUF, (X1), (Y1), (R)))
    78# define FillTriangle(BUF,X1,Y1,dX,dY) (bDrawTriFill (BUF, (X1), (Y1), (dX), (dY)))
    89# define OpenTriangle(BUF,X1,Y1,X2,Y2,X3,Y3) (bDrawTriOpen (BUF, (X1), (Y1), (X2), (Y2), (X3), (Y3)))
     
    260261  float *x, *y, *z;
    261262  double mxi, mxj, myi, myj, bxi, bxj, byi, byj, bx, by;
    262   int sx, sy, sx1, sy1, sx2, sy2, d, D;
     263  int sx, sy, sx1, sy1, sx2, sy2, ds, dz, D;
     264  unsigned char *pixel1, *pixel2, *pixel3;
    263265
    264266  mxi = graph[0].axis[0].dfx / (object[0].x1 - object[0].x0);
     
    275277  by = byi + byj;
    276278 
    277   /* below here, code is identical with DrawObjects */
     279  Graphic *graphic = GetGraphic();
     280
     281  ALLOCATE (pixel1, unsigned char, graphic[0].Npixels);
     282  ALLOCATE (pixel2, unsigned char, graphic[0].Npixels);
     283  ALLOCATE (pixel3, unsigned char, graphic[0].Npixels);
     284
     285  /** cmap[i].pixel must be defined even if X is not used **/
     286  for (i = 0; i < graphic[0].Npixels; i++) { /* set up pixel array */
     287    pixel1[i] = graphic[0].cmap[i].red >> 8;
     288    pixel2[i] = graphic[0].cmap[i].green >> 8;
     289    pixel3[i] = graphic[0].cmap[i].blue >> 8;
     290  }
     291
    278292  /**** points are scaled by object.z ***/
    279   if (object[0].size < 0) {
    280     d = 0.5 * (graphic->dx + graphic->dy) * 0.01;
    281     x = object[0].x; y = object[0].y; z = object[0].z;
    282     if (object[0].ptype == 0) { /* filled box */
    283       for (i = 0; i < object[0].Npts; i++) {
    284         if (!(finite(x[i]) && finite(y[i]))) continue;
    285         sx = x[i]*mxi + y[i]*mxj + bx;
    286         sy = x[i]*myi + y[i]*myj + by;
    287         if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
    288             (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy))
    289         {
    290           D = d*z[i];
    291           FillRectangle (buffer, sx, sy, 2*D, 2*D);
    292         }
    293       }
    294     }
    295     if (object[0].ptype == 1) { /* open box */
    296       for (i = 0; i < object[0].Npts; i++) {
    297         if (!(finite(x[i]) && finite(y[i]))) continue;
    298         sx = x[i]*mxi + y[i]*mxj + bx;
    299         sy = x[i]*myi + y[i]*myj + by;
    300         if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
    301             (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy))
    302         {
    303           D = d*z[i];
    304           DrawRectangle (buffer, sx, sy, 2*D, 2*D);
    305         }
    306       }
    307     }
    308     if (object[0].ptype == 2) { /* cross */
    309       for (i = 0; i < object[0].Npts; i++) {
    310         if (!(finite(x[i]) && finite(y[i]))) continue;
    311         sx = x[i]*mxi + y[i]*mxj + bx;
    312         sy = x[i]*myi + y[i]*myj + by;
    313         if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
    314             (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy))
    315         {
    316           D = d*z[i];
    317           DrawLine (buffer, sx - D, sy, sx + D, sy);
    318           DrawLine (buffer, sx, sy - D, sx, sy + D);
    319         }
    320       }
    321     }
    322     if (object[0].ptype == 3) { /* x */
    323       for (i = 0; i < object[0].Npts; i++) {
    324         if (!(finite(x[i]) && finite(y[i]))) continue;
    325         sx = x[i]*mxi + y[i]*mxj + bx;
    326         sy = x[i]*myi + y[i]*myj + by;
    327         if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
    328             (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy))
    329         {
    330           D = d*z[i];
    331           DrawLine (buffer, sx + D, sy - D, sx - D, sy + D);
    332           DrawLine (buffer, sx - D, sy - D, sx + D, sy + D);
    333         }
    334       }
    335     }
    336     if (object[0].ptype == 4) { /* filled triangle */
    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         {
    344           D = d*z[i];
    345           // FillTriangle (buffer, sx - D, sy - 0.58*D, sx + D, sy - 0.58*D, sx, sy + 1.15*D);
    346           FillTriangle (buffer, sx, sy + 0.58*D, D, -1.73*D);
    347         }
    348       }
    349     }
    350     if (object[0].ptype == 5) { /* open triangle */
    351       for (i = 0; i < object[0].Npts; i++) {
    352         if (!(finite(x[i]) && finite(y[i]))) continue;
    353         sx = x[i]*mxi + y[i]*mxj + bx;
    354         sy = x[i]*myi + y[i]*myj + by;
    355         if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
    356             (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy))
    357         {
    358           D = d*z[i];
    359           OpenTriangle (buffer, sx - D, sy + 0.58*D, sx + D, sy + 0.58*D, sx, sy - 1.15*D);
    360         }
    361       }
    362     }
    363     if (object[0].ptype == 6) { /* Y */
    364       for (i = 0; i < object[0].Npts; i++) {
    365         if (!(finite(x[i]) && finite(y[i]))) continue;
    366         sx = x[i]*mxi + y[i]*mxj + bx;
    367         sy = x[i]*myi + y[i]*myj + by;
    368         if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
    369             (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy))
    370         {
    371           D = d*z[i];
    372           DrawLine (buffer, sx, sy, sx - D, sy - 0.58*D);
    373           DrawLine (buffer, sx, sy, sx + D, sy - 0.58*D);
    374           DrawLine (buffer, sx, sy, sx,     sy + 1.15*D);
    375         }
    376       }
    377     }
    378     if (object[0].ptype == 7) { /* 0 */
    379       for (i = 0; i < object[0].Npts; i++) {
    380         if (!(finite(x[i]) && finite(y[i]))) continue;
    381         sx = x[i]*mxi + y[i]*mxj + bx;
    382         sy = x[i]*myi + y[i]*myj + by;
    383         if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
    384             (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy))
    385         {
    386           D = d*z[i];
    387           DrawCircle (buffer, sx, sy, D);
    388         }
    389       }
    390     }
    391     if (object[0].ptype == 8) { /* pentagon */
    392       for (i = 0; i < object[0].Npts; i++) {
    393         if (!(finite(x[i]) && finite(y[i]))) continue;
    394         sx = x[i]*mxi + y[i]*mxj + bx;
    395         sy = x[i]*myi + y[i]*myj + by;
    396         if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
    397             (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy))
    398         {
    399           D = d*z[i];
    400           DrawLine (buffer, sx + 0.00*D, sy - 1.00*D, sx + 0.95*D, sy - 0.31*D);
    401           DrawLine (buffer, sx + 0.95*D, sy - 0.31*D, sx + 0.58*D, sy + 0.81*D);
    402           DrawLine (buffer, sx + 0.58*D, sy + 0.81*D, sx - 0.58*D, sy + 0.81*D);
    403           DrawLine (buffer, sx - 0.58*D, sy + 0.81*D, sx - 0.95*D, sy - 0.31*D);
    404           DrawLine (buffer, sx - 0.95*D, sy - 0.31*D, sx + 0.00*D, sy - 1.00*D);
    405         }
    406       }
    407     }
    408     if (object[0].ptype == 9) { /* hexagon */
    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           D = d*z[i];
    417           DrawLine (buffer, sx -      D, sy,          sx - 0.50*D, sy + 0.87*D);
    418           DrawLine (buffer, sx - 0.50*D, sy + 0.87*D, sx + 0.50*D, sy + 0.87*D);
    419           DrawLine (buffer, sx + 0.50*D, sy + 0.87*D, sx +      D, sy);
    420           DrawLine (buffer, sx +      D, sy,          sx + 0.50*D, sy - 0.87*D);
    421           DrawLine (buffer, sx + 0.50*D, sy - 0.87*D, sx - 0.50*D, sy - 0.87*D);
    422           DrawLine (buffer, sx - 0.50*D, sy - 0.87*D, sx -      D, sy);
    423         }
    424       }
    425     }
    426     if (object[0].ptype == 100) {       /* connect a pair of points */
    427 
    428       double X0 = graph[0].axis[0].fx;
    429       double X1 = graph[0].axis[0].fx + graph[0].axis[0].dfx;
    430       double Y0 = graph[0].axis[1].fy;
    431       double Y1 = graph[0].axis[1].fy + graph[0].axis[1].dfy;
    432 
    433       for (i = 0; i + 1 < object[0].Npts; i+=2) {
    434         if (!(finite(x[i]) && finite(y[i]))) continue;
    435         sx1 = x[i]*mxi + y[i]*mxj + bx;
    436         sy1 = x[i]*myi + y[i]*myj + by;
    437         sx2 = x[i+1]*mxi + y[i+1]*mxj + bx;
    438         sy2 = x[i+1]*myi + y[i+1]*myj + by;
    439         bDrawClipLine (buffer, sx1, sy1, sx2, sy2, X0, Y0, X1, Y1);
    440       }
    441     }
    442   } else {
    443     d = (int)(object[0].size * hypot((float)graphic->dx, (float)graphic->dy) * 0.003);
    444     x = object[0].x; y = object[0].y;
    445 
    446     if (object[0].ptype == 0) { /* filled box */
    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           FillRectangle (buffer, sx, sy, 2*d, 2*d);
    455         }
    456       }
    457     }
    458     if (object[0].ptype == 1) {         /* open box */
    459       for (i = 0; i < object[0].Npts; i++) {
    460         if (!(finite(x[i]) && finite(y[i]))) continue;
    461         sx = x[i]*mxi + y[i]*mxj + bx;
    462         sy = x[i]*myi + y[i]*myj + by;
    463         if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
    464             (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy))
    465         {
    466           DrawRectangle (buffer, sx, sy, 2*d, 2*d);
    467         }
    468       }
    469     }
    470     if (object[0].ptype == 2) { /* cross : OK */
    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         {
    478           DrawLine (buffer, sx - d, sy, sx + d, sy);
    479           DrawLine (buffer, sx, sy - d, sx, sy + d);
    480         }
    481       }
    482     }
    483     if (object[0].ptype == 3) {         /* x */
    484       for (i = 0; i < object[0].Npts; i++) {
    485         if (!(finite(x[i]) && finite(y[i]))) continue;
    486         sx = x[i]*mxi + y[i]*mxj + bx;
    487         sy = x[i]*myi + y[i]*myj + by;
    488         if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
    489             (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy))
    490         {
    491           DrawLine (buffer, sx + d, sy - d, sx - d, sy + d);
    492           DrawLine (buffer, sx - d, sy - d, sx + d, sy + d);
    493         }
    494       }
    495     }
    496     if (object[0].ptype == 4) { /* filled triangle */
    497       for (i = 0; i < object[0].Npts; i++) {
    498         if (!(finite(x[i]) && finite(y[i]))) continue;
    499         sx = x[i]*mxi + y[i]*mxj + bx;
    500         sy = x[i]*myi + y[i]*myj + by;
    501         if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
    502             (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy))
    503         {
    504           FillTriangle (buffer, sx, sy + 0.58*d, d, -1.73*d);
    505         }
    506       }
    507     }
    508     if (object[0].ptype == 5) { /* open triangle */
    509       for (i = 0; i < object[0].Npts; i++) {
    510         if (!(finite(x[i]) && finite(y[i]))) continue;
    511         sx = x[i]*mxi + y[i]*mxj + bx;
    512         sy = x[i]*myi + y[i]*myj + by;
    513         if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
    514             (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy))
    515         {
    516           OpenTriangle (buffer, sx - d, sy + 0.58*d, sx + d, sy + 0.58*d, sx, sy - 1.15*d);
    517         }
    518       }
    519     }
    520     if (object[0].ptype == 6) { /* Y */
    521       for (i = 0; i < object[0].Npts; i++) {
    522         if (!(finite(x[i]) && finite(y[i]))) continue;
    523         sx = x[i]*mxi + y[i]*mxj + bx;
    524         sy = x[i]*myi + y[i]*myj + by;
    525         if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
    526             (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy))
    527         {
    528           DrawLine (buffer, sx, sy, sx - d, sy - 0.58*d);
    529           DrawLine (buffer, sx, sy, sx + d, sy - 0.58*d);
    530           DrawLine (buffer, sx, sy, sx,     sy + 1.15*d);
    531         }
    532       }
    533     }
    534     if (object[0].ptype == 7) { /* 0 */
    535       for (i = 0; i < object[0].Npts; i++) {
    536         if (!(finite(x[i]) && finite(y[i]))) continue;
    537         sx = x[i]*mxi + y[i]*mxj + bx;
    538         sy = x[i]*myi + y[i]*myj + by;
    539         if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
    540             (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy))
    541         {
    542           DrawCircle (buffer, sx, sy, d);
    543         }
    544       }
    545     }
    546     if (object[0].ptype == 8) { /* pentagon */
    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           DrawLine (buffer, sx + 0.00*d, sy - 1.00*d, sx + 0.95*d, sy - 0.31*d);
    555           DrawLine (buffer, sx + 0.95*d, sy - 0.31*d, sx + 0.58*d, sy + 0.81*d);
    556           DrawLine (buffer, sx + 0.58*d, sy + 0.81*d, sx - 0.58*d, sy + 0.81*d);
    557           DrawLine (buffer, sx - 0.58*d, sy + 0.81*d, sx - 0.95*d, sy - 0.31*d);
    558           DrawLine (buffer, sx - 0.95*d, sy - 0.31*d, sx + 0.00*d, sy - 1.00*d);
    559         }
    560       }
    561     }
    562     if (object[0].ptype == 9) { /* pentagon */
    563       for (i = 0; i < object[0].Npts; i++) {
    564         if (!(finite(x[i]) && finite(y[i]))) continue;
    565         sx = x[i]*mxi + y[i]*mxj + bx;
    566         sy = x[i]*myi + y[i]*myj + by;
    567         if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
    568             (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy))
    569         {
    570           DrawLine (buffer, sx - 1.00*d, sy + 0.00*d, sx - 0.50*d, sy + 0.87*d);
    571           DrawLine (buffer, sx - 0.50*d, sy + 0.87*d, sx + 0.50*d, sy + 0.87*d);
    572           DrawLine (buffer, sx + 0.50*d, sy + 0.87*d, sx + 1.00*d, sy + 0.00*d);
    573           DrawLine (buffer, sx + 1.00*d, sy + 0.00*d, sx + 0.50*d, sy - 0.87*d);
    574           DrawLine (buffer, sx + 0.50*d, sy - 0.87*d, sx - 0.50*d, sy - 0.87*d);
    575           DrawLine (buffer, sx - 0.50*d, sy - 0.87*d, sx - 1.00*d, sy + 0.00*d);
    576         }
    577       }
    578     }
    579     if (object[0].ptype == 100) {       
    580 
    581       double X0 = graph[0].axis[0].fx;
    582       double X1 = graph[0].axis[0].fx + graph[0].axis[0].dfx;
    583       double Y0 = graph[0].axis[1].fy;
    584       double Y1 = graph[0].axis[1].fy + graph[0].axis[1].dfy;
    585 
    586       for (i = 0; i + 1 < object[0].Npts; i+=2) {
    587         if (!(finite(x[i]) && finite(y[i]))) continue;
    588         sx1 = x[i]*mxi + y[i]*mxj + bx;
    589         sy1 = x[i]*myi + y[i]*myj + by;
    590         sx2 = x[i+1]*mxi + y[i+1]*mxj + bx;
    591         sy2 = x[i+1]*myi + y[i+1]*myj + by;
    592         bDrawClipLine (buffer, sx1, sy1, sx2, sy2, X0, Y0, X1, Y1);
    593       }
    594     }
    595   }
     293  int scaleSize = (object[0].size < 0);
     294  int scaleColor = (object[0].color < 0);
     295
     296  ds = 0.5 * (graphic->dx + graphic->dy) * 0.003 * object[0].size;
     297  dz = 0.5 * (graphic->dx + graphic->dy) * 0.010;
     298  x = object[0].x; y = object[0].y; z = object[0].z;
     299
     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          int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
     310          buffer->bColor_R = pixel1[pixel];
     311          buffer->bColor_G = pixel2[pixel];
     312          buffer->bColor_B = pixel3[pixel];
     313        }
     314        D = scaleSize ? dz*z[i] : ds;
     315        FillRectangle (buffer, sx, sy, 2*D, 2*D);
     316      }
     317    }
     318  }
     319  if (object[0].ptype == 1) {   /* open box */
     320    for (i = 0; i < object[0].Npts; i++) {
     321      if (!(finite(x[i]) && finite(y[i]))) continue;
     322      sx = x[i]*mxi + y[i]*mxj + bx;
     323      sy = x[i]*myi + y[i]*myj + by;
     324      if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
     325          (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy))
     326      {
     327        if (scaleColor) {
     328          int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
     329          buffer->bColor_R = pixel1[pixel];
     330          buffer->bColor_G = pixel2[pixel];
     331          buffer->bColor_B = pixel3[pixel];
     332        }
     333        D = scaleSize ? dz*z[i] : ds;
     334        DrawRectangle (buffer, sx, sy, 2*D, 2*D);
     335      }
     336    }
     337  }
     338  if (object[0].ptype == 2) { /* cross */
     339    for (i = 0; i < object[0].Npts; i++) {
     340      if (!(finite(x[i]) && finite(y[i]))) continue;
     341      sx = x[i]*mxi + y[i]*mxj + bx;
     342      sy = x[i]*myi + y[i]*myj + by;
     343      if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
     344          (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy))
     345      {
     346        if (scaleColor) {
     347          int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
     348          buffer->bColor_R = pixel1[pixel];
     349          buffer->bColor_G = pixel2[pixel];
     350          buffer->bColor_B = pixel3[pixel];
     351        }
     352        D = scaleSize ? dz*z[i] : ds;
     353        DrawLine (buffer, sx - D, sy, sx + D, sy);
     354        DrawLine (buffer, sx, sy - D, sx, sy + D);
     355      }
     356    }
     357  }
     358  if (object[0].ptype == 3) {   /* x */
     359    for (i = 0; i < object[0].Npts; i++) {
     360      if (!(finite(x[i]) && finite(y[i]))) continue;
     361      sx = x[i]*mxi + y[i]*mxj + bx;
     362      sy = x[i]*myi + y[i]*myj + by;
     363      if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
     364          (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy))
     365      {
     366        if (scaleColor) {
     367          int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
     368          buffer->bColor_R = pixel1[pixel];
     369          buffer->bColor_G = pixel2[pixel];
     370          buffer->bColor_B = pixel3[pixel];
     371        }
     372        D = scaleSize ? dz*z[i] : ds;
     373        DrawLine (buffer, sx + D, sy - D, sx - D, sy + D);
     374        DrawLine (buffer, sx - D, sy - D, sx + D, sy + D);
     375      }
     376    }
     377  }
     378  if (object[0].ptype == 4) {   /* filled triangle */
     379    for (i = 0; i < object[0].Npts; i++) {
     380      if (!(finite(x[i]) && finite(y[i]))) continue;
     381      sx = x[i]*mxi + y[i]*mxj + bx;
     382      sy = x[i]*myi + y[i]*myj + by;
     383      if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
     384          (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy))
     385      {
     386        if (scaleColor) {
     387          int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
     388          buffer->bColor_R = pixel1[pixel];
     389          buffer->bColor_G = pixel2[pixel];
     390          buffer->bColor_B = pixel3[pixel];
     391        }
     392        D = scaleSize ? dz*z[i] : ds;
     393        // FillTriangle (buffer, sx - D, sy - 0.58*D, sx + D, sy - 0.58*D, sx, sy + 1.15*D);
     394        FillTriangle (buffer, sx, sy + 0.58*D, D, -1.73*D);
     395      }
     396    }
     397  }
     398  if (object[0].ptype == 5) {   /* open triangle */
     399    for (i = 0; i < object[0].Npts; i++) {
     400      if (!(finite(x[i]) && finite(y[i]))) continue;
     401      sx = x[i]*mxi + y[i]*mxj + bx;
     402      sy = x[i]*myi + y[i]*myj + by;
     403      if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
     404          (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy))
     405      {
     406        if (scaleColor) {
     407          int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
     408          buffer->bColor_R = pixel1[pixel];
     409          buffer->bColor_G = pixel2[pixel];
     410          buffer->bColor_B = pixel3[pixel];
     411        }
     412        D = scaleSize ? dz*z[i] : ds;
     413        OpenTriangle (buffer, sx - D, sy + 0.58*D, sx + D, sy + 0.58*D, sx, sy - 1.15*D);
     414      }
     415    }
     416  }
     417  if (object[0].ptype == 6) {   /* Y */
     418    for (i = 0; i < object[0].Npts; i++) {
     419      if (!(finite(x[i]) && finite(y[i]))) continue;
     420      sx = x[i]*mxi + y[i]*mxj + bx;
     421      sy = x[i]*myi + y[i]*myj + by;
     422      if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
     423          (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy))
     424      {
     425        if (scaleColor) {
     426          int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
     427          buffer->bColor_R = pixel1[pixel];
     428          buffer->bColor_G = pixel2[pixel];
     429          buffer->bColor_B = pixel3[pixel];
     430        }
     431        D = scaleSize ? dz*z[i] : ds;
     432        DrawLine (buffer, sx, sy, sx - D, sy - 0.58*D);
     433        DrawLine (buffer, sx, sy, sx + D, sy - 0.58*D);
     434        DrawLine (buffer, sx, sy, sx,     sy + 1.15*D);
     435      }
     436    }
     437  }
     438  if (object[0].ptype == 7) {   /* 0 */
     439    for (i = 0; i < object[0].Npts; i++) {
     440      if (!(finite(x[i]) && finite(y[i]))) continue;
     441      sx = x[i]*mxi + y[i]*mxj + bx;
     442      sy = x[i]*myi + y[i]*myj + by;
     443      if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
     444          (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy))
     445      {
     446        if (scaleColor) {
     447          int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
     448          buffer->bColor_R = pixel1[pixel];
     449          buffer->bColor_G = pixel2[pixel];
     450          buffer->bColor_B = pixel3[pixel];
     451        }
     452        D = scaleSize ? dz*z[i] : ds;
     453        DrawCircle (buffer, sx, sy, D);
     454      }
     455    }
     456  }
     457  if (object[0].ptype == 8) {   /* pentagon */
     458    for (i = 0; i < object[0].Npts; i++) {
     459      if (!(finite(x[i]) && finite(y[i]))) continue;
     460      sx = x[i]*mxi + y[i]*mxj + bx;
     461      sy = x[i]*myi + y[i]*myj + by;
     462      if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
     463          (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy))
     464      {
     465        if (scaleColor) {
     466          int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
     467          buffer->bColor_R = pixel1[pixel];
     468          buffer->bColor_G = pixel2[pixel];
     469          buffer->bColor_B = pixel3[pixel];
     470        }
     471        D = scaleSize ? dz*z[i] : ds;
     472        DrawLine (buffer, sx + 0.00*D, sy - 1.00*D, sx + 0.95*D, sy - 0.31*D);
     473        DrawLine (buffer, sx + 0.95*D, sy - 0.31*D, sx + 0.58*D, sy + 0.81*D);
     474        DrawLine (buffer, sx + 0.58*D, sy + 0.81*D, sx - 0.58*D, sy + 0.81*D);
     475        DrawLine (buffer, sx - 0.58*D, sy + 0.81*D, sx - 0.95*D, sy - 0.31*D);
     476        DrawLine (buffer, sx - 0.95*D, sy - 0.31*D, sx + 0.00*D, sy - 1.00*D);
     477      }
     478    }
     479  }
     480  if (object[0].ptype == 9) {   /* hexagon */
     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      {
     488        if (scaleColor) {
     489          int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
     490          buffer->bColor_R = pixel1[pixel];
     491          buffer->bColor_G = pixel2[pixel];
     492          buffer->bColor_B = pixel3[pixel];
     493        }
     494        D = scaleSize ? dz*z[i] : ds;
     495        DrawLine (buffer, sx -      D, sy,          sx - 0.50*D, sy + 0.87*D);
     496        DrawLine (buffer, sx - 0.50*D, sy + 0.87*D, sx + 0.50*D, sy + 0.87*D);
     497        DrawLine (buffer, sx + 0.50*D, sy + 0.87*D, sx +      D, sy);
     498        DrawLine (buffer, sx +      D, sy,          sx + 0.50*D, sy - 0.87*D);
     499        DrawLine (buffer, sx + 0.50*D, sy - 0.87*D, sx - 0.50*D, sy - 0.87*D);
     500        DrawLine (buffer, sx - 0.50*D, sy - 0.87*D, sx -      D, sy);
     501      }
     502    }
     503  }
     504  if (object[0].ptype == 10) {  /* filled circle */
     505    for (i = 0; i < object[0].Npts; i++) {
     506      if (!(finite(x[i]) && finite(y[i]))) continue;
     507      sx = x[i]*mxi + y[i]*mxj + bx;
     508      sy = x[i]*myi + y[i]*myj + by;
     509      if ((sx > graph[0].axis[0].fx) && (sx < graph[0].axis[0].fx + graph[0].axis[0].dfx) &&
     510          (sy < graph[0].axis[1].fy) && (sy > graph[0].axis[1].fy + graph[0].axis[1].dfy))
     511      {
     512        if (scaleColor) {
     513          int pixel = MIN (graphic->Npixels - 2, MAX (0, z[i]*(graphic->Npixels - 1)));
     514          buffer->bColor_R = pixel1[pixel];
     515          buffer->bColor_G = pixel2[pixel];
     516          buffer->bColor_B = pixel3[pixel];
     517        }
     518        D = scaleSize ? dz*z[i] : ds;
     519        FillCircle (buffer, sx, sy, D);
     520      }
     521    }
     522  }
     523  if (object[0].ptype == 100) { /* connect a pair of points */
     524
     525    double X0 = graph[0].axis[0].fx;
     526    double X1 = graph[0].axis[0].fx + graph[0].axis[0].dfx;
     527    double Y0 = graph[0].axis[1].fy;
     528    double Y1 = graph[0].axis[1].fy + graph[0].axis[1].dfy;
     529
     530    for (i = 0; i + 1 < object[0].Npts; i+=2) {
     531      if (!(finite(x[i]) && finite(y[i]))) continue;
     532      sx1 = x[i]*mxi + y[i]*mxj + bx;
     533      sy1 = x[i]*myi + y[i]*myj + by;
     534      sx2 = x[i+1]*mxi + y[i+1]*mxj + bx;
     535      sy2 = x[i+1]*myi + y[i+1]*myj + by;
     536      bDrawClipLine (buffer, sx1, sy1, sx2, sy2, X0, Y0, X1, Y1);
     537    }
     538  }
     539
     540  free (pixel1);
     541  free (pixel2);
     542  free (pixel3);
    596543}
    597544   
Note: See TracChangeset for help on using the changeset viewer.