static PetscErrorCode PetscDrawString_X(PetscDraw draw,PetscReal x,PetscReal y,int c,const char chrs[]) { PetscErrorCode ierr; int xx,yy; size_t len; PetscDraw_X *XiWin = (PetscDraw_X*)draw->data; char *substr; PetscToken token; PetscFunctionBegin; xx = XTRANS(draw,XiWin,x); yy = YTRANS(draw,XiWin,y); PetscDrawXiSetColor(XiWin,c); ierr = PetscTokenCreate(chrs,'\n',&token);CHKERRQ(ierr); ierr = PetscTokenFind(token,&substr);CHKERRQ(ierr); ierr = PetscStrlen(substr,&len);CHKERRQ(ierr); XDrawString(XiWin->disp,PetscDrawXiDrawable(XiWin),XiWin->gc.set,xx,yy - XiWin->font->font_descent,substr,len); ierr = PetscTokenFind(token,&substr);CHKERRQ(ierr); while (substr) { yy += 4*XiWin->font->font_descent; ierr = PetscStrlen(substr,&len);CHKERRQ(ierr); XDrawString(XiWin->disp,PetscDrawXiDrawable(XiWin),XiWin->gc.set,xx,yy - XiWin->font->font_descent,substr,len); ierr = PetscTokenFind(token,&substr);CHKERRQ(ierr); } ierr = PetscTokenDestroy(&token);CHKERRQ(ierr); PetscFunctionReturn(0); }
PetscErrorCode PetscDrawGetImage_X(PetscDraw draw,unsigned char palette[PETSC_DRAW_MAXCOLOR][3],unsigned int *out_w,unsigned int *out_h,unsigned char *out_pixels[]) { PetscDraw_X *Xwin = (PetscDraw_X*)draw->data; PetscMPIInt rank; PetscErrorCode ierr; PetscFunctionBegin; if (out_w) *out_w = 0; if (out_h) *out_h = 0; if (out_pixels) *out_pixels = NULL; ierr = MPI_Comm_rank(PetscObjectComm((PetscObject)draw),&rank);CHKERRQ(ierr); /* make sure the X server processed requests from all processes */ ierr = PetscDrawCollectiveBegin(draw);CHKERRQ(ierr); XSync(Xwin->disp,True); ierr = PetscDrawCollectiveEnd(draw);CHKERRQ(ierr); ierr = MPI_Barrier(PetscObjectComm((PetscObject)draw));CHKERRQ(ierr); /* only the first process return image data */ ierr = PetscDrawCollectiveBegin(draw);CHKERRQ(ierr); if (!rank) { Window root; XImage *ximage; int pmap[PETSC_DRAW_MAXCOLOR]; unsigned char *pixels = NULL; unsigned int w,h,dummy; int x,y,p; /* copy colormap palette to the caller */ ierr = PetscMemcpy(palette,Xwin->cpalette,sizeof(Xwin->cpalette));CHKERRQ(ierr); /* get image out of the drawable */ XGetGeometry(Xwin->disp,PetscDrawXiDrawable(Xwin),&root,&x,&y,&w,&h,&dummy,&dummy); ximage = XGetImage(Xwin->disp,PetscDrawXiDrawable(Xwin),0,0,w,h,AllPlanes,ZPixmap); if (!ximage) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB,"Cannot XGetImage()"); /* build indirect sort permutation (a.k.a argsort) of the color -> pixel mapping */ for (p=0; p<PETSC_DRAW_MAXCOLOR; p++) pmap[p] = p; /* identity permutation */ ierr = PetscArgSortPixVal(Xwin->cmapping,pmap,255);CHKERRQ(ierr); /* extract pixel values out of the image and map them to color indices */ ierr = PetscMalloc1(w*h,&pixels);CHKERRQ(ierr); for (p=0,y=0; y<(int)h; y++) for (x=0; x<(int)w; x++) { PetscDrawXiPixVal pix = XGetPixel(ximage,x,y); pixels[p++] = (unsigned char)PetscDrawXiPixelToColor(Xwin,pmap,pix); } XDestroyImage(ximage); *out_w = w; *out_h = h; *out_pixels = pixels; } ierr = PetscDrawCollectiveEnd(draw);CHKERRQ(ierr); PetscFunctionReturn(0); }
static PetscErrorCode PetscDrawTriangle_X(PetscDraw draw,PetscReal X1,PetscReal Y_1,PetscReal X2,PetscReal Y2,PetscReal X3,PetscReal Y3,int c1,int c2,int c3) { PetscDraw_X* XiWin = (PetscDraw_X*)draw->data; PetscErrorCode ierr; PetscFunctionBegin; if (c1 == c2 && c2 == c3) { XPoint pt[3]; PetscDrawXiSetColor(XiWin,c1); pt[0].x = XTRANS(draw,XiWin,X1); pt[0].y = YTRANS(draw,XiWin,Y_1); pt[1].x = XTRANS(draw,XiWin,X2); pt[1].y = YTRANS(draw,XiWin,Y2); pt[2].x = XTRANS(draw,XiWin,X3); pt[2].y = YTRANS(draw,XiWin,Y3); XFillPolygon(XiWin->disp,PetscDrawXiDrawable(XiWin),XiWin->gc.set,pt,3,Convex,CoordModeOrigin); } else { int x1,y_1,x2,y2,x3,y3; x1 = XTRANS(draw,XiWin,X1); y_1 = YTRANS(draw,XiWin,Y_1); x2 = XTRANS(draw,XiWin,X2); y2 = YTRANS(draw,XiWin,Y2); x3 = XTRANS(draw,XiWin,X3); y3 = YTRANS(draw,XiWin,Y3); ierr = PetscDrawInterpolatedTriangle_X(XiWin,x1,y_1,c1,x2,y2,c2,x3,y3,c3);CHKERRQ(ierr); } PetscFunctionReturn(0); }
static PetscErrorCode PetscDrawPointPixel_X(PetscDraw draw,PetscInt x,PetscInt y,int c) { PetscDraw_X* XiWin = (PetscDraw_X*)draw->data; PetscFunctionBegin; PetscDrawXiSetColor(XiWin,c); XDrawPoint(XiWin->disp,PetscDrawXiDrawable(XiWin),XiWin->gc.set,x,y); PetscFunctionReturn(0); }
static PetscErrorCode PetscDrawEllipse_X(PetscDraw Win, PetscReal x, PetscReal y, PetscReal a, PetscReal b, int c) { PetscDraw_X* XiWin = (PetscDraw_X*) Win->data; int xA, yA, w, h; PetscFunctionBegin; PetscDrawXiSetColor(XiWin, c); xA = XTRANS(Win, XiWin, x - a/2.0); w = XTRANS(Win, XiWin, x + a/2.0) - xA; yA = YTRANS(Win, XiWin, y + b/2.0); h = PetscAbs(YTRANS(Win, XiWin, y - b/2.0) - yA); XFillArc(XiWin->disp, PetscDrawXiDrawable(XiWin), XiWin->gc.set, xA, yA, w, h, 0, 23040); PetscFunctionReturn(0); }
PetscErrorCode PetscDrawArrow_X(PetscDraw draw,PetscReal xl,PetscReal yl,PetscReal xr,PetscReal yr,int cl) { PetscDraw_X* XiWin = (PetscDraw_X*)draw->data; int x1,y_1,x2,y2; PetscFunctionBegin; PetscDrawXiSetColor(XiWin,cl); x1 = XTRANS(draw,XiWin,xl); x2 = XTRANS(draw,XiWin,xr); y_1 = YTRANS(draw,XiWin,yl); y2 = YTRANS(draw,XiWin,yr); if (x1 == x2 && y_1 == y2) PetscFunctionReturn(0); XDrawLine(XiWin->disp,PetscDrawXiDrawable(XiWin),XiWin->gc.set,x1,y_1,x2,y2); if (x1 == x2 && PetscAbs(y_1 - y2) > 7) { if (y2 > y_1) { XDrawLine(XiWin->disp,PetscDrawXiDrawable(XiWin),XiWin->gc.set,x2,y2,x2-3,y2-3); XDrawLine(XiWin->disp,PetscDrawXiDrawable(XiWin),XiWin->gc.set,x2,y2,x2+3,y2-3); } else { XDrawLine(XiWin->disp,PetscDrawXiDrawable(XiWin),XiWin->gc.set,x2,y2,x2-3,y2+3); XDrawLine(XiWin->disp,PetscDrawXiDrawable(XiWin),XiWin->gc.set,x2,y2,x2+3,y2+3); } } PetscFunctionReturn(0); }
PetscErrorCode PetscDrawLine_X(PetscDraw draw,PetscReal xl,PetscReal yl,PetscReal xr,PetscReal yr,int cl) { PetscDraw_X* XiWin = (PetscDraw_X*)draw->data; int x1,y_1,x2,y2; PetscFunctionBegin; PetscDrawXiSetColor(XiWin,cl); x1 = XTRANS(draw,XiWin,xl); x2 = XTRANS(draw,XiWin,xr); y_1 = YTRANS(draw,XiWin,yl); y2 = YTRANS(draw,XiWin,yr); if (x1 == x2 && y_1 == y2) PetscFunctionReturn(0); XDrawLine(XiWin->disp,PetscDrawXiDrawable(XiWin),XiWin->gc.set,x1,y_1,x2,y2); PetscFunctionReturn(0); }
static PetscErrorCode PetscDrawRectangle_X(PetscDraw draw,PetscReal xl,PetscReal yl,PetscReal xr,PetscReal yr,int c1,int c2,int c3,int c4) { PetscDraw_X* XiWin = (PetscDraw_X*)draw->data; int x1,y_1,w,h,c = (c1 + c2 + c3 + c4)/4; PetscFunctionBegin; PetscDrawXiSetColor(XiWin,c); x1 = XTRANS(draw,XiWin,xl); w = XTRANS(draw,XiWin,xr) - x1; y_1 = YTRANS(draw,XiWin,yr); h = YTRANS(draw,XiWin,yl) - y_1; if (w <= 0) w = 1; if (h <= 0) h = 1; XFillRectangle(XiWin->disp,PetscDrawXiDrawable(XiWin),XiWin->gc.set,x1,y_1,w,h); PetscFunctionReturn(0); }
static PetscErrorCode PetscDrawPoint_X(PetscDraw draw,PetscReal x,PetscReal y,int c) { int xx,yy,i,j; PetscDraw_X* XiWin = (PetscDraw_X*)draw->data; PetscFunctionBegin; xx = XTRANS(draw,XiWin,x); yy = YTRANS(draw,XiWin,y); PetscDrawXiSetColor(XiWin,c); for (i=-1; i<2; i++) { for (j=-1; j<2; j++) { XDrawPoint(XiWin->disp,PetscDrawXiDrawable(XiWin),XiWin->gc.set,xx+i,yy+j); } } PetscFunctionReturn(0); }
static PetscErrorCode PetscDrawClear_X(PetscDraw draw) { PetscDraw_X* XiWin = (PetscDraw_X*)draw->data; int x, y, w, h; PetscErrorCode ierr; PetscFunctionBegin; ierr = PetscDrawSave(draw);CHKERRQ(ierr); x = (int)(draw->port_xl*XiWin->w); w = (int)((draw->port_xr - draw->port_xl)*XiWin->w); y = (int)((1.0-draw->port_yr)*XiWin->h); h = (int)((draw->port_yr - draw->port_yl)*XiWin->h); PetscDrawXiSetPixVal(XiWin,XiWin->background); XFillRectangle(XiWin->disp,PetscDrawXiDrawable(XiWin),XiWin->gc.set,x,y,w,h); PetscFunctionReturn(0); }
PetscErrorCode PetscDrawStringVertical_X(PetscDraw draw,PetscReal x,PetscReal y,int c,const char chrs[]) { PetscErrorCode ierr; int xx,yy; PetscDraw_X *XiWin = (PetscDraw_X*)draw->data; char tmp[2]; PetscReal tw,th; size_t i,n; PetscFunctionBegin; ierr = PetscStrlen(chrs,&n);CHKERRQ(ierr); tmp[1] = 0; PetscDrawXiSetColor(XiWin,c); ierr = PetscDrawStringGetSize_X(draw,&tw,&th);CHKERRQ(ierr); xx = XTRANS(draw,XiWin,x); for (i=0; i<n; i++) { tmp[0] = chrs[i]; yy = YTRANS(draw,XiWin,y-th*i); XDrawString(XiWin->disp,PetscDrawXiDrawable(XiWin),XiWin->gc.set, xx,yy - XiWin->font->font_descent,tmp,1); } PetscFunctionReturn(0); }