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
6a4963045SJacob 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
PetscDrawXiSetPixVal(PetscDraw_X * W,PetscDrawXiPixVal pix)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)
55*835f2295SStefano Zampini #define PetscDrawXiValidColor(W, color) PetscCheck((color) >= 0 && (color) < PETSC_DRAW_MAXCOLOR, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Color value %d out of range [0..%d]", 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