15c6c1daeSBarry Smith /* 25c6c1daeSBarry Smith Defines the internal data structures for the X-windows 35c6c1daeSBarry Smith implementation of the graphics functionality in PETSc. 45c6c1daeSBarry Smith */ 55c6c1daeSBarry Smith 65c6c1daeSBarry Smith #if !defined(_XIMPL_H) 75c6c1daeSBarry Smith #define _XIMPL_H 8af0996ceSBarry Smith #include <petsc/private/drawimpl.h> 95c6c1daeSBarry Smith 105c6c1daeSBarry Smith #include <X11/Xlib.h> 115c6c1daeSBarry Smith #include <X11/Xutil.h> 125c6c1daeSBarry Smith 135c6c1daeSBarry Smith typedef unsigned long PetscDrawXiPixVal; 145c6c1daeSBarry Smith 155c6c1daeSBarry Smith typedef struct { 165c6c1daeSBarry Smith GC set; 175c6c1daeSBarry Smith PetscDrawXiPixVal cur_pix; 185c6c1daeSBarry Smith } PetscDrawXiGC; 195c6c1daeSBarry Smith 205c6c1daeSBarry Smith typedef struct { 215c6c1daeSBarry Smith Font fnt; 225c6c1daeSBarry Smith int font_w,font_h; 235c6c1daeSBarry Smith int font_descent; 245c6c1daeSBarry Smith PetscDrawXiPixVal font_pix; 255c6c1daeSBarry Smith } PetscDrawXiFont; 265c6c1daeSBarry Smith 275c6c1daeSBarry Smith typedef struct { 28f4e3882fSLisandro Dalcin Display *disp; /* Display */ 29f4e3882fSLisandro Dalcin int screen; /* Screen of display */ 305c6c1daeSBarry Smith Visual *vis; /* Graphics visual */ 315c6c1daeSBarry Smith int depth; /* Depth of visual */ 32f4e3882fSLisandro Dalcin PetscDrawXiGC gc; /* Graphics context */ 33f4e3882fSLisandro Dalcin PetscDrawXiFont *font; /* Current font */ 34f4e3882fSLisandro Dalcin Window win; /* Window */ 35f4e3882fSLisandro Dalcin Drawable drw; /* Pixmap */ 36f4e3882fSLisandro Dalcin Colormap cmap; /* Colormap */ 37f4e3882fSLisandro Dalcin int cmapsize; /* Number of allocated colors */ 38f4e3882fSLisandro Dalcin PetscDrawXiPixVal foreground; /* Foreground pixel */ 39f4e3882fSLisandro Dalcin PetscDrawXiPixVal background; /* Background pixel */ 40*0ed3bfb6SBarry Smith PetscDrawXiPixVal cmapping[PETSC_DRAW_MAXCOLOR]; /* Map color -> pixel value */ 41*0ed3bfb6SBarry Smith unsigned char cpalette[PETSC_DRAW_MAXCOLOR][3]; /* Map color -> RGB value*/ 42f4e3882fSLisandro Dalcin int x,y,w,h; /* Location and size window */ 435c6c1daeSBarry Smith } PetscDraw_X; 445c6c1daeSBarry Smith 455c6c1daeSBarry Smith #define PetscDrawXiDrawable(w) ((w)->drw ? (w)->drw : (w)->win) 465c6c1daeSBarry Smith 47f4e3882fSLisandro Dalcin PETSC_STATIC_INLINE void PetscDrawXiSetPixVal(PetscDraw_X *W,PetscDrawXiPixVal pix) 48f4e3882fSLisandro Dalcin { if (W->gc.cur_pix != pix) { XSetForeground(W->disp,W->gc.set,pix); W->gc.cur_pix = pix; } } 495c6c1daeSBarry Smith 50f4e3882fSLisandro Dalcin #if defined(PETSC_USE_DEBUG) 51f4e3882fSLisandro Dalcin #define PetscDrawXiValidColor(W,color) \ 52*0ed3bfb6SBarry Smith do { if (PetscUnlikely((color)<0||(color)>=PETSC_DRAW_MAXCOLOR)) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Color value %D out of range [0..%d]",(PetscInt)(color),PETSC_DRAW_MAXCOLOR-1); } while (0) 53f4e3882fSLisandro Dalcin #else 5426d657cfSLisandro Dalcin #define PetscDrawXiValidColor(W,color) do {} while (0) 55f4e3882fSLisandro Dalcin #endif 56f4e3882fSLisandro Dalcin 57f4e3882fSLisandro Dalcin #define PetscDrawXiSetColor(W,color) do { PetscDrawXiValidColor(W,color); PetscDrawXiSetPixVal(W,(W)->cmapping[(color)]); } while (0) 585c6c1daeSBarry Smith 5909440f25SLisandro Dalcin PETSC_INTERN PetscErrorCode PetscDrawXiInit(PetscDraw_X*,const char[]); 6009440f25SLisandro Dalcin PETSC_INTERN PetscErrorCode PetscDrawXiClose(PetscDraw_X*); 6109440f25SLisandro Dalcin PETSC_INTERN PetscErrorCode PetscDrawXiFontFixed(PetscDraw_X*,int,int,PetscDrawXiFont**); 6209440f25SLisandro Dalcin PETSC_INTERN PetscErrorCode PetscDrawXiColormap(PetscDraw_X*); 6309440f25SLisandro Dalcin PETSC_INTERN PetscErrorCode PetscDrawXiQuickWindow(PetscDraw_X*,char*,int,int,int,int); 6409440f25SLisandro Dalcin PETSC_INTERN PetscErrorCode PetscDrawXiQuickWindowFromWindow(PetscDraw_X*,Window); 6509440f25SLisandro Dalcin PETSC_INTERN PetscErrorCode PetscDrawXiQuickPixmap(PetscDraw_X*); 66bf780456SLisandro Dalcin PETSC_INTERN PetscErrorCode PetscDrawXiResizeWindow(PetscDraw_X*,int,int); 6748db01dbSLisandro Dalcin PETSC_INTERN PetscErrorCode PetscDrawXiGetGeometry(PetscDraw_X*,int*,int*,int*,int*); 6809440f25SLisandro Dalcin 695c6c1daeSBarry Smith #endif 70