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 6*a4963045SJacob Faibussowitsch #pragma once 7af0996ceSBarry Smith #include <petsc/private/drawimpl.h> 85c6c1daeSBarry Smith 95c6c1daeSBarry Smith #include <X11/Xlib.h> 105c6c1daeSBarry Smith #include <X11/Xutil.h> 115c6c1daeSBarry Smith 125c6c1daeSBarry Smith typedef unsigned long PetscDrawXiPixVal; 135c6c1daeSBarry Smith 145c6c1daeSBarry Smith typedef struct { 155c6c1daeSBarry Smith GC set; 165c6c1daeSBarry Smith PetscDrawXiPixVal cur_pix; 175c6c1daeSBarry Smith } PetscDrawXiGC; 185c6c1daeSBarry Smith 195c6c1daeSBarry Smith typedef struct { 205c6c1daeSBarry Smith Font fnt; 215c6c1daeSBarry Smith int font_w, font_h; 225c6c1daeSBarry Smith int font_descent; 235c6c1daeSBarry Smith PetscDrawXiPixVal font_pix; 245c6c1daeSBarry Smith } PetscDrawXiFont; 255c6c1daeSBarry Smith 265c6c1daeSBarry Smith typedef struct { 27f4e3882fSLisandro Dalcin Display *disp; /* Display */ 28f4e3882fSLisandro Dalcin int screen; /* Screen of display */ 295c6c1daeSBarry Smith Visual *vis; /* Graphics visual */ 305c6c1daeSBarry Smith int depth; /* Depth of visual */ 31f4e3882fSLisandro Dalcin PetscDrawXiGC gc; /* Graphics context */ 32f4e3882fSLisandro Dalcin PetscDrawXiFont *font; /* Current font */ 33f4e3882fSLisandro Dalcin Window win; /* Window */ 34f4e3882fSLisandro Dalcin Drawable drw; /* Pixmap */ 35f4e3882fSLisandro Dalcin Colormap cmap; /* Colormap */ 36f4e3882fSLisandro Dalcin int cmapsize; /* Number of allocated colors */ 37f4e3882fSLisandro Dalcin PetscDrawXiPixVal foreground; /* Foreground pixel */ 38f4e3882fSLisandro Dalcin PetscDrawXiPixVal background; /* Background pixel */ 390ed3bfb6SBarry Smith PetscDrawXiPixVal cmapping[PETSC_DRAW_MAXCOLOR]; /* Map color -> pixel value */ 400ed3bfb6SBarry Smith unsigned char cpalette[PETSC_DRAW_MAXCOLOR][3]; /* Map color -> RGB value*/ 41f4e3882fSLisandro Dalcin int x, y, w, h; /* Location and size window */ 425c6c1daeSBarry Smith } PetscDraw_X; 435c6c1daeSBarry Smith 445c6c1daeSBarry Smith #define PetscDrawXiDrawable(w) ((w)->drw ? (w)->drw : (w)->win) 455c6c1daeSBarry Smith 46d71ae5a4SJacob Faibussowitsch static inline void PetscDrawXiSetPixVal(PetscDraw_X *W, PetscDrawXiPixVal pix) 47d71ae5a4SJacob Faibussowitsch { 489371c9d4SSatish Balay if (W->gc.cur_pix != pix) { 499371c9d4SSatish Balay XSetForeground(W->disp, W->gc.set, pix); 509371c9d4SSatish Balay W->gc.cur_pix = pix; 519371c9d4SSatish Balay } 529371c9d4SSatish Balay } 535c6c1daeSBarry Smith 54f4e3882fSLisandro Dalcin #if defined(PETSC_USE_DEBUG) 552c71b3e2SJacob Faibussowitsch #define PetscDrawXiValidColor(W, color) PetscCheck((color) >= 0 && (color) < PETSC_DRAW_MAXCOLOR, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Color value %" PetscInt_FMT " out of range [0..%d]", (PetscInt)(color), PETSC_DRAW_MAXCOLOR - 1) 56f4e3882fSLisandro Dalcin #else 579371c9d4SSatish Balay #define PetscDrawXiValidColor(W, color) \ 589371c9d4SSatish Balay do { \ 599371c9d4SSatish Balay } while (0) 60f4e3882fSLisandro Dalcin #endif 61f4e3882fSLisandro Dalcin 629371c9d4SSatish Balay #define PetscDrawXiSetColor(W, color) \ 639371c9d4SSatish Balay do { \ 649371c9d4SSatish Balay PetscDrawXiValidColor(W, color); \ 659371c9d4SSatish Balay PetscDrawXiSetPixVal(W, (W)->cmapping[(color)]); \ 669371c9d4SSatish Balay } while (0) 675c6c1daeSBarry Smith 6809440f25SLisandro Dalcin PETSC_INTERN PetscErrorCode PetscDrawXiInit(PetscDraw_X *, const char[]); 6909440f25SLisandro Dalcin PETSC_INTERN PetscErrorCode PetscDrawXiClose(PetscDraw_X *); 7009440f25SLisandro Dalcin PETSC_INTERN PetscErrorCode PetscDrawXiFontFixed(PetscDraw_X *, int, int, PetscDrawXiFont **); 7109440f25SLisandro Dalcin PETSC_INTERN PetscErrorCode PetscDrawXiColormap(PetscDraw_X *); 7209440f25SLisandro Dalcin PETSC_INTERN PetscErrorCode PetscDrawXiQuickWindow(PetscDraw_X *, char *, int, int, int, int); 7309440f25SLisandro Dalcin PETSC_INTERN PetscErrorCode PetscDrawXiQuickWindowFromWindow(PetscDraw_X *, Window); 7409440f25SLisandro Dalcin PETSC_INTERN PetscErrorCode PetscDrawXiQuickPixmap(PetscDraw_X *); 75bf780456SLisandro Dalcin PETSC_INTERN PetscErrorCode PetscDrawXiResizeWindow(PetscDraw_X *, int, int); 7648db01dbSLisandro Dalcin PETSC_INTERN PetscErrorCode PetscDrawXiGetGeometry(PetscDraw_X *, int *, int *, int *, int *); 77