File: header.h

package info (click to toggle)
ygl 4.2e-7
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 772 kB
  • sloc: ansic: 8,724; makefile: 89; fortran: 55; sed: 20; sh: 19
file content (295 lines) | stat: -rw-r--r-- 9,282 bytes parent folder | download | duplicates (4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
/*
 *    Ygl: Run GL programs with standard X11 and/or OpenGL routines.
 *    (C) Fred Hucht 1993-2007
 *    EMail: fred<at>thp.Uni-Duisburg.de
 *
 *    $Id: header.h,v 4.9 2007-05-08 13:25:02+02 fred Exp $
 */

#ifdef _AIX
#define _POSIX_SOURCE 	/* else sigaction isn't defined under AIX 3.2 */
#endif

#include "config.h"

#ifdef YGL_PREFIX	/* If all routines should get the prefix ygl_
			 * to avoid naming conflicts */
# include "X11/Yglprefix.h" /* must be included first (don't ask why...) */
#endif

#ifdef X11
# include <X11/Xlib.h>
# include <X11/Xutil.h>
# include <X11/Xos.h>
#else
# undef DOUBLEBUF
# undef MULTIBUF
#endif

#ifdef OGL
# include <GL/gl.h>
# include <GL/glu.h>
# include <GL/glx.h>
#endif

#include <stdio.h>  	/* fprintf */
#include <stdlib.h> 	/* malloc  */
#include <stdarg.h> 	/* defpup(...), warn() */
#include <string.h>
#include <memory.h>
#include <sys/time.h>
#ifdef _AIX
/*extern int setitimer(int, const struct itimerval *, struct itimerval *);*/
#endif
#ifdef AUTOFLUSH
# include <signal.h>
#endif
#include "X11/Ygl.h"

#define Ygl _Ygl_Control_	/* Alias for readability. _Ygl_Control_ is the only visible external of libYgl.a */

#define D 			Ygl.display
#define W 			Ygl.active

#define YglScreen		DefaultScreen(D)
#define YglScreenHeight  	DisplayHeight(D, YglScreen)
#define YglScreenWidth	  	 DisplayWidth(D, YglScreen)

#define KEYMAP_LEN 256		/* For init_keymap() etc. */
#define KEYMAP_BIT 0x1000	/* Is key qdevice()d? */

typedef unsigned long  Ulong;
typedef unsigned int   Uint;
typedef unsigned short Ushort;

#ifdef OGL
# ifdef X11
/* Use both */
#  define IFOGL(o, x) do if(Ygl.UseOGL) {o;} else {x;} while(0)
# else
/* Only use OGL */
#  define IFOGL(o, x) o
# endif
#else
# ifdef X11
/* Only use X11 */
#  define IFOGL(o, x) x
#else
/* Should not happen */
#  error "Define at least one of OGL, X11"
# endif
#endif

typedef struct YglWindow_ {
  Window	top;		/* top-level window of window, used for colormap installation */
  Window  	main;		/* main window */
#ifdef RGBWIN
  Window	win;		/* == main when in cmap mode, sub of main when in RGBmode */
#endif
  Window	draw; 		/* drawable, only differ from win when doublebuffering */
  GC		gc, *gclist, chargc;
  int		font;		/* window's font id */
  int		linewidth; 	/* active linewidth */
  int		linestyle; 	/* active linestyle (index into misc.c:linestyles) */
  Colorindex	color;		/* active color in CMap mode */
  double  	xf, yf; 	/* scaling factor for macros XR(), YR()*/
  double  	xo, yo; 	/* offset to coords for macros X(), Y()*/
  int     	xm, ym; 	/* width, height of window */
  double  	xp, yp; 	/* graphics cursor position */
  double       	xc, yc; 	/* text cursor position */
  int		vl, vr, vb, vt;	/* viewport left, right, bottom, top */
  int		vw, vh;		/* viewport width, height */
  double	ol, or, ob, ot;	/* ortho2 left, right, bottom, top */
#ifdef OGL
  double  	zp; 		/* graphics cursor z-position */
  double       	zc; 		/* text cursor z-position */
  double	on, of;		/* ortho near, far */
#endif
  Window	xpid;		/* real X Parent window ID (excl. WM) */
  Int32		pid;    	/* parent id (swinopen),
				 * 0  if window opened with winopen,
				 * -1 if window converted with winX */
#if defined(DOUBLEBUF) || defined(MULTIBUF)
  Window 	dbufs[2];	/* the two doublebuffers */
#endif
#ifdef MULTIBUF
  int	 	dispbuf;	/* dbufs[dispbuf] is displayed */
#endif
  Pixmap	pm;		/* Pixmap for dithering in RGBmode */
  GC		pmgc;		/* GC for it */
  XImage	*pmi;		/* XImage for dithering */
  unsigned char	red,green,blue;	/* Dithered RGBcolors for gRGBcolor */
  unsigned char vmode;		/* vertex mode of window */
#ifdef OGL
  GLXContext 	cx;		/* OpenGL context */
#if 0
  GLUquadricObj *circ, *circf;	/* OpenGL object for circ etc. */
#endif
#endif
  /*------------------------------ Bitfields: */
  Uint   	rgb:1;    	/* True if window in RGBmode */
  Uint		mapped:1;    	/* True if window is mapped */
  Uint		dbuf:1;		/* True if window in doublebuffer mode */
  Uint		clipped:1;	/* True if clipping is activated (viewport) */
} YglWindow;

typedef struct YglFont_ {
  XFontStruct 	*fs;
  Int32 	id;
} YglFont;

/* Global symbols */

typedef struct YglControl_ {
  Display   	*display;
  YglWindow 	*Windows, *active;
  int		ActiveWindow, NextWindow;
  /*------------------------------ Bitfields: */
#ifdef AUTOFLUSH
  Uint		flush:1;
#endif
  Uint		wm_dw_flag:1;
  Uint		stat:1;		/* CMap visual static? */
  Uint		PCM:1;		/* use private colormap? */
  Uint		BS:1;		/* YGL_BS (backing store ) set */
  Uint		GC:1;		/* Use single GC in CMap windows (slower) */
  Uint		EmulateCmap:1;	/* cmapmode uses TrueColor or DirectColor visual */
#ifdef OGL
  Uint		UseOGL:1;	/* Use OpenGL routines */
  Uint		SelectMode:1;	/* in GL_SELECT mode */
#endif
  /*------------------------------ End of Bitfields */
  YglFont	*Fonts;
  int		LastFont;
  Ulong		EventMask;
  Atom		wm_dw;
  
  int		FT;		/* autoflush time in msec */
  int		V[2];		/* User requested visuals */
  Window	PWID;		/* Parent window ID */
  int		DSZ;		/* size of RGBmode dither matrix */
  
  Colormap	CCmap, RCmap;
  
  Ulong		*Colors;
  Ulong		*ColorsInv;	/* for lrectread */
  
  int		rs, gs, bs;	/* bits to shift */
  int  		rb, gb, bb;	/* width of mask */
  
  const char 	**XEventNames;	/* For debugging */
  
  
  
  void		(*noinit)(const char *);
  int		(*notimplemented)(const char *);
  int		(*warn)(const char *, const char *, ...);
  Int32 	(*x2gl_wid)(Window, int);
  int		(*XRscale)(double);
  int		(*YRscale)(double);
  int		(*Xscale )(double);
  int		(*Yscale )(double);
  void		(*await_windowevent)(Window, long, int);
  const char* 	(*devicename)(Device);
  /*------------------------------ End of initialized values (see ygl.c) */
  long  	keymap[KEYMAP_LEN]; /* For getbutton() and queueing of keys */
  XEvent	lastreadevent;	/* not inited, For dopup() */
  XVisualInfo	CV, RV;		/* not inited, must be last */
} YglControl;

extern YglControl Ygl;

#define EMULATE_CMAP_DEPTH 	8	/* no comment */
#define MAX_MULTIGC_CMAPSIZE	256	/* Above that we use single GC in cmap mode */

#define CMapSize   Ygl.CV.colormap_size

#define RMask      RV.visual->red_mask
#define GMask      RV.visual->green_mask
#define BMask      RV.visual->blue_mask

#define EnterLeaveMask 	(EnterWindowMask|LeaveWindowMask)
#define RedrawMask 	(ExposureMask|StructureNotifyMask)
#define DoRGB 	   	(DoRed|DoGreen|DoBlue)

#define VertexNone	0 /* Vertex modes */
#define VertexPoint	1
#define VertexLine	2
#define VertexCLine	3
#define VertexPoly	4
#define VertexTMesh	5

#define YglVisual()	(W->rgb ? Ygl.RV.visual : Ygl.CV.visual)
#define YglDepth()	(W->rgb ? Ygl.RV.depth  : Ygl.CV.depth )
#define YglColormap()	(W->rgb ? Ygl.RCmap     : Ygl.CCmap    )

#define YGL_COLORS(x) 	 (Ygl.PCM ? CMapSize-1-(x) : Ygl.Colors[x])

#define Yprintf		Ygl.warn

#if DEBUG > 1
/* # define I(name) if(fprintf(stderr, "Entering %s\n", name) && D == NULL) Ygl.noinit(name) */
static void I(const char *name, const char *format, ...) {
  va_list Argp;
  va_start(Argp, format);
  fprintf(stderr, "Entering %s(", name);
  vfprintf(stderr, format, Argp);
  fprintf(stderr, ")\n");
  va_end(Argp);
  if ( D == NULL ) Ygl.noinit(name);
}
#else
static void I(const char *name, const char *format, ...) {
  if ( D == NULL ) Ygl.noinit(name);
}
/*# define I(name, ...) if(D == NULL) Ygl.noinit(name)*/
#endif

#ifdef AUTOFLUSH
# ifdef DEBUG
#  define F if(Ygl.flush) { Ygl.flush = False; fprintf(stderr, "Autoflushing.\n"); IFOGL(glFlush(), XFlush(D)); }
# else
#  define F if(Ygl.flush) { Ygl.flush = False; IFOGL(glFlush(), XFlush(D)); }
# endif
#else /*AUTOFLUSH*/
# define F
#endif /*AUTOFLUSH*/

#define XR(x) 	Ygl.XRscale(x)		/* rescaled x, rounded to next int */
#define YR(y) 	Ygl.YRscale(y)		/* rescaled y, dito */
#define X(x)    Ygl.Xscale(x)		/* rescaled and shifted x */
#define Y(y) 	Ygl.Yscale(y)		/* rescaled and shifted and mirrored y */

#define XS(x) 	X(W->xp = (x))		/* return X(x) and set cursor position */
#define YS(y) 	Y(W->yp = (y))		/* return Y(y) and set cursor position */

/* Set cursor positions. Ex.: SCP(=x,=y,=0), SCP(+=x,+=y,=0); */
#ifdef OGL
# define SCP(gx,gy,gz) {W->xp gx;W->yp gy;W->zp gz;}
#else
# define SCP(gx,gy,gz) {W->xp gx;W->yp gy;}
#endif

#define MIN(x,y) ((x)<(y) ?   (x) :(y))
#define MAX(x,y) ((x)>(y) ?   (x) :(y))
#define ABS(x)   ((x)< 0  ? (-(x)):(x))

/* #if defined(DEBUG) && !defined(malloc) */
#ifdef DEBUG
# undef malloc
# undef calloc
# undef realloc
static char *debug_malloc_p;
# define malloc(x)      (debug_malloc_p = malloc(x   ), fprintf(stderr, "malloc: x=%d r=0x%x\n",            x, debug_malloc_p), debug_malloc_p)
# define calloc(x, y)   (debug_malloc_p = calloc(x, y), fprintf(stderr, "calloc: x=%d y=%d r=0x%x\n",    x, y, debug_malloc_p), debug_malloc_p)
# define realloc(p, x) (debug_malloc_p = realloc(p, x), fprintf(stderr, "realloc: p=0x%x x=%d r=0x%x\n", p, x, debug_malloc_p), debug_malloc_p)
# define free(p) (fprintf(stderr, "free: p=0x%x\n", p), free(p))
#endif

#define X2GL_TOP	0
#define X2GL_MAIN	1
#define X2GL_WIN	2
#define X2GL_DRAW	3

#define NI(name)      do {static int i = 1; if(i) Ygl.notimplemented(name); i = 0; return;    } while(0)
#define NIR(name,ret) do {static int i = 1; if(i) Ygl.notimplemented(name); i = 0; return ret;} while(0)