xref: /petsc/src/sys/classes/draw/impls/x/ximpl.h (revision 0ed3bfb6ec21ed29e56fd524d353af30e5ebf413)
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