Changeset 1897 in Sophya for trunk/SophyaPI/PI/pigraphx.cc


Ignore:
Timestamp:
Feb 10, 2002, 6:51:58 PM (24 years ago)
Author:
ansari
Message:

Optimisation implementation PIGraphX::DrawMarker - Reza 10/02/2002

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/SophyaPI/PI/pigraphx.cc

    r1890 r1897  
    3838xgv.plane_mask = ~0;
    3939mDefGC = XCreateGC (PIXDisplay(), XtWindow(PIXtTopWdg()), GCFunction | GCPlaneMask, &xgv);
    40 
     40mMrkGC = XCreateGC (PIXDisplay(), XtWindow(PIXtTopWdg()), GCFunction | GCPlaneMask, &xgv);
     41mFgMrkGCOK = false;
    4142Init();
    4243}
     
    5556xgv.plane_mask = ~0;
    5657mDefGC = XCreateGC (mDisp, mWId, GCFunction | GCPlaneMask, &xgv);
     58mMrkGC = XCreateGC (PIXDisplay(), XtWindow(PIXtTopWdg()), GCFunction | GCPlaneMask, &xgv);
     59mFgMrkGCOK = false;
    5760Init();
    5861}
     
    7174SelMarker(1, PI_DotMarker); 
    7275mFCfMap = colpix[PI_Black];  mBCfMap = colpix[PI_White];
     76mFgMrkGCOK = false;
    7377}
    7478
     
    7781{
    7882XFreeGC(mDisp, mDefGC);
     83XFreeGC(mDisp, mMrkGC);
    7984}
    8085
     
    238243}
    239244
     245
    240246/* --Methode-- */
    241247void PIGraphicX::DrawArc(PIGrCoord x0, PIGrCoord y0, PIGrCoord dx, PIGrCoord dy,
     
    262268void PIGraphicX::DrawMarker(PIGrCoord x0, PIGrCoord y0)
    263269{
    264 float hmsz = mMrkSz/2;
    265 float dmsz = mMrkSz-hmsz;
    266 PIGrCoord x[11],y[11];
    267 int k;
    268 PILineAtt clatt;
    269 
    270 if (mMrk == PI_DotMarker)
     270
     271if (mMrk == PI_DotMarker) {
    271272  XDrawPoint(mDisp, mWId, DefGC(), (int)x0, (int)y0);
    272 
     273  return;
     274}
    273275else  {
    274   clatt = mLAtt;
    275   SelLine(PI_ThinLine);
     276  int x1,x2,y1,y2,r;
     277  float hmsz = mMrkSz/2;
     278  float dmsz = mMrkSz-hmsz;
     279  XPoint pxp[12];
     280  int k;
     281  bool fgcgc = SetupMrkGC();
    276282  switch (mMrk) {
    277283    case  PI_PlusMarker :
    278       DrawLine((float)x0-hmsz, y0, (float)x0+dmsz, y0);
    279       DrawLine(x0, (float)y0-hmsz, x0, (float)y0+dmsz);
     284      x1 = (float)x0-hmsz;   y1 = y0;
     285      x2 = (float)x0+dmsz;   y2 = y1;
     286      XDrawLine(XtDisplay (MyWdg()), mWId, mMrkGC, x1, y1, x2, y2);
     287      x1 = x0;  y1 = (float)y0-hmsz;
     288      x2 = x1;  y2 = (float)y0+dmsz;
     289      XDrawLine(XtDisplay (MyWdg()), mWId, mMrkGC, x1, y1, x2, y2);
    280290      break;
    281291    case  PI_CrossMarker :
    282       DrawLine((float)x0-hmsz, (float)y0-hmsz, (float)x0+dmsz, (float)y0+dmsz);
    283       DrawLine((float)x0-hmsz, (float)y0+dmsz, (float)x0+dmsz, (float)y0-hmsz);
     292      x1 = (float)x0-hmsz;   y1 = (float)y0-hmsz;
     293      x2 = (float)x0+dmsz;   y2 = (float)y0+dmsz;
     294      XDrawLine(XtDisplay (MyWdg()), mWId, mMrkGC, x1, y1, x2, y2);
     295      XDrawLine(XtDisplay (MyWdg()), mWId, mMrkGC, x1, y2, x2, y1);
    284296      break; 
    285297    case PI_CircleMarker :
    286       DrawCircle(x0, y0, hmsz);
    287       break;
    288298    case PI_FCircleMarker :
    289       DrawFCircle(x0, y0, hmsz);
     299      r = hmsz;
     300      x1 = (int)x0-r;  y1 = (int)y0-r;
     301      if (mMrk == PI_CircleMarker)
     302        XDrawArc(XtDisplay (MyWdg()), mWId, mMrkGC, x1, y1, 2*r, 2*r, 0, 360*64);
     303      else XFillArc(XtDisplay (MyWdg()), mWId, mMrkGC, x1, y1, 2*r, 2*r, 0, 360*64);
    290304      break;
    291305    case PI_BoxMarker :
    292       DrawBox((float)x0-hmsz, (float)y0-hmsz, mMrkSz, mMrkSz);
    293       break;
    294306    case PI_FBoxMarker :
    295       DrawFBox((float)x0-hmsz, (float)y0-hmsz, mMrkSz, mMrkSz);
     307      pxp[0].x = (int)x0-hmsz;  pxp[0].y = (int)y0-hmsz;
     308      pxp[1].x = (int)x0+hmsz;  pxp[1].y = (int)y0-hmsz;
     309      pxp[2].x = (int)x0+hmsz;  pxp[2].y = (int)y0+hmsz;
     310      pxp[3].x = (int)x0-hmsz;  pxp[3].y = (int)y0+hmsz;
     311      pxp[4].x = (int)x0-hmsz;  pxp[4].y = (int)y0-hmsz;
     312      if (mMrk == PI_BoxMarker) MrkDrawPolygon(pxp, 5, false);
     313      else MrkDrawFPolygon(pxp, 5, false);
    296314      break;
    297315    case  PI_TriangleMarker :
    298       x[1] = mMrkSz; y[1] = 0; x[2] = -hmsz; y[2] = -mMrkSz;
    299       x[3] = -dmsz; y[3] = +mMrkSz; x[0] = (float)x0-hmsz; y[0] = (float)y0+hmsz; 
    300       DrawPolygon(x, y, 4);
    301       break;
    302316    case  PI_FTriangleMarker :
    303       x[1] = mMrkSz; y[1] = 0; x[2] = -hmsz; y[2] = -mMrkSz;
    304       x[3] = -dmsz; y[3] = +mMrkSz; x[0] = (float)x0-hmsz; y[0] = (float)y0+hmsz; 
    305       DrawFPolygon(x, y, 4);
     317      pxp[1].x = mMrkSz; pxp[1].y = 0; pxp[2].x = -hmsz; pxp[2].y = -mMrkSz;
     318      pxp[3].x = -dmsz;  pxp[3].y = +mMrkSz; pxp[0].x = (float)x0-hmsz; pxp[0].y = (float)y0+hmsz;
     319      if (mMrk == PI_TriangleMarker) MrkDrawPolygon(pxp, 4, true);
     320      else MrkDrawFPolygon(pxp, 4, true);
    306321      break;
    307322    case  PI_StarMarker :
    308323    case  PI_FStarMarker :
    309324      for(k=0; k<10; k++) {
    310         x[k] = (int)(starcoordx[k]*hmsz+(float)x0+0.5);
    311         y[k] = (int)(starcoordy[k]*hmsz+(float)y0+0.5);
     325        pxp[k].x = (int)(starcoordx[k]*hmsz+(float)x0+0.5);
     326        pxp[k].y = (int)(starcoordy[k]*hmsz+(float)y0+0.5);
    312327        }
    313       x[10] = x[0];   y[10] = y[0];
    314       if (mMrk == PI_StarMarker)  DrawPolygon(x, y, 11, false);
    315       else DrawFPolygon(x, y, 11, false);
     328      pxp[10].x = pxp[0].x;   pxp[10].y = pxp[0].y;
     329      if (mMrk == PI_StarMarker)   MrkDrawPolygon(pxp, 11, false);
     330      else  MrkDrawFPolygon(pxp, 11, false);
    316331      break;
    317332    default :
     
    319334      break;
    320335    }
    321   SelLine(clatt);
     336  if (fgcgc) mFgMrkGCOK = false;
    322337  }
    323338
     
    340355  if (n > NMXXPOINTS)  delete[] pxp; 
    341356  }
    342 else for(i=0; i<n; i++) DrawMarker(x[i], y[i]);
    343 
     357else {
     358  SetupMrkGC();
     359  for(i=0; i<n; i++) DrawMarker(x[i], y[i]);
     360  mFgMrkGCOK = false;
     361}
    344362return;
    345363}
     
    385403return;
    386404}
     405
     406/* --Methode-- */
     407bool PIGraphicX::SetupMrkGC()
     408{
     409if (mFgMrkGCOK) return(false);
     410XCopyGC(mDisp, DefGC(), GCFunction|GCForeground|GCBackground|GCPlaneMask, mMrkGC);
     411XSetLineAttributes(mDisp, mMrkGC, 1, LineSolid, CapButt, JoinMiter);
     412mFgMrkGCOK = true;
     413return true;
     414}
     415
     416/* --Methode-- */
     417void PIGraphicX::MrkDrawPolygon(XPoint *pxp, int n, bool cinc)
     418{
     419
     420if (n <= 0)  return;
     421int mode = CoordModeOrigin;
     422if (cinc) mode =  CoordModePrevious;
     423XDrawLines(mDisp, mWId, mMrkGC, pxp, n, mode);
     424
     425return;
     426}
     427
     428
     429/* --Methode-- */
     430void PIGraphicX::MrkDrawFPolygon(XPoint *pxp, int n, bool cinc)
     431{
     432int mode = CoordModeOrigin;
     433if (cinc) mode =  CoordModePrevious;
     434XFillPolygon(XtDisplay (MyWdg()), mWId, mMrkGC, pxp, n,
     435                        Complex, mode);
     436return;
     437}
     438
    387439
    388440
Note: See TracChangeset for help on using the changeset viewer.