5#include <X11/extensions/XShm.h>
39 if (XMatchVisualInfo (
dpy, screen, 16, TrueColor, &vinfo)) {
41 }
else if (XMatchVisualInfo (
dpy, screen, 24, TrueColor, &vinfo)) {
43 }
else if (XMatchVisualInfo (
dpy, screen, 32, TrueColor, &vinfo)) {
45 }
else if (XMatchVisualInfo (
dpy, screen, 8, PseudoColor, &vinfo)) {
52 return XGetVisualInfo(
dpy,VisualAllMask,&vinfo,&n);
62 if (shareList != NULL) {
82static int glxXErrorFlag=0;
84static int glxHandleXError(Display *
dpy,XErrorEvent *event)
90static int bits_per_pixel(Display *
dpy, XVisualInfo *visinfo)
98 return visinfo->depth;
100 img = XCreateImage(
dpy, visinfo->visual, visinfo->depth,
101 ZPixmap, 0, data, 1, 1, 32, 0);
104 return visinfo->depth;
106 bpp = img->bits_per_pixel;
114 int xsize,
int ysize,
int depth)
118 unsigned char *framebuffer;
119 int (*old_handler)(Display *,XErrorEvent *);
121 if (XShmQueryVersion(ctx->
display,&major,&minor,&pixmaps))
129 ctx->
ximage=XShmCreateImage(ctx->
display,None,depth,ZPixmap,NULL,
131 if (ctx->
ximage == NULL) {
132 fprintf(stderr,
"XShm: error: XShmCreateImage\n");
137 ctx->
shm_info->shmid=shmget(IPC_PRIVATE,
141 fprintf(stderr,
"XShm: error: shmget\n");
144 XDestroyImage(ctx->
ximage);
148 if (ctx->
ximage->data == (
char *) -1) {
149 fprintf(stderr,
"XShm: error: shmat\n");
151 shmctl(ctx->
shm_info->shmid,IPC_RMID,0);
161 old_handler=XSetErrorHandler(glxHandleXError);
168 XSetErrorHandler(old_handler);
173 shmctl(ctx->
shm_info->shmid,IPC_RMID,0);
181 XSetErrorHandler(old_handler);
184 fprintf(stderr,
"XShm: error: XShmPutImage\n");
196 ctx->
ximage=XCreateImage(ctx->
display, None, depth, ZPixmap, 0,
197 NULL,xsize,ysize, 8, 0);
199 ctx->
ximage->data = (
char *)framebuffer;
208 XDestroyImage(ctx->
ximage);
213 XDestroyImage(ctx->
ximage);
235 if (xsize == 0 || ysize == 0)
return -1;
240 if (ctx->
ximage != NULL) free_ximage(ctx);
262 XWindowAttributes attr;
276 XGetWindowAttributes(ctx->
display,drawable,&attr);
281 if (attr.depth != ctx->
visual_info.depth)
return False;
287 if (attr.depth == 8) {
289 ctx->
cmap = attr.colormap;
291 if ( XAllocColorCells(ctx->
display,ctx->
cmap,True,&tmp_plane,0,
294 ctx->
cmap = XCreateColormap(ctx->
display, drawable,
296 XSetWindowColormap(ctx->
display, drawable, ctx->
cmap);
304 color_indexes,palette,NULL);
306 fprintf(stderr,
"Error while initializing Z buffer\n");
311 xcolor.flags = DoRed | DoGreen | DoBlue;
313 xcolor.red = (palette[i]>>8) & 0xFF00;
314 xcolor.green = (palette[i] & 0xFF00);
315 xcolor.blue = (palette[i] << 8) & 0xFF00;
316 xcolor.pixel = pixel[i];
338 zb=
ZB_open(xsize,ysize,mode,0,NULL,NULL,NULL);
340 fprintf(stderr,
"Error while initializing Z buffer\n");
346 ctx->
gc = XCreateGC(ctx->
display, drawable, 0, 0);
364static Bool WaitForShmCompletion(Display *
dpy, XEvent *event,
char *arg)
369 ( ((XShmCompletionEvent *)event)->drawable == (Window)ctx->
drawable);
387 ctx->
ximage->bytes_per_line);
395 XShmPutImage(
dpy,drawable,ctx->
gc,
398 XIfEvent(
dpy, &event, WaitForShmCompletion, (
char*)ctx);
400 XPutImage(
dpy, drawable, ctx->
gc,
void gl_fatal_error(char *format,...)
void glViewport(int x, int y, int width, int height)
void glInit(void *zbuffer)
int glX_resize_viewport(GLContext *c, int *xsize_ptr, int *ysize_ptr)
GLXContext glXCreateContext(Display *dpy, XVisualInfo *vis, GLXContext shareList, Bool direct)
Bool glXMakeCurrent(Display *dpy, GLXDrawable drawable, GLXContext ctx1)
void glXDestroyContext(Display *dpy, GLXContext ctx1)
XVisualInfo * glXChooseVisual(Display *dpy, int screen, int *attribList)
Bool glXQueryExtension(Display *dpy, int *errorb, int *event)
void glXSwapBuffers(Display *dpy, GLXDrawable drawable)
GLContext * gl_get_context(void)
void * gl_malloc(int size)
int(* gl_resize_viewport)(struct GLContext *c, int *xsize, int *ysize)
XShmSegmentInfo * shm_info
void ZB_copyFrameBuffer(ZBuffer *zb, void *buf, int linesize)
void ZB_resize(ZBuffer *zb, void *frame_buffer, int xsize, int ysize)
ZBuffer * ZB_open(int xsize, int ysize, int mode, int nb_colors, unsigned char *color_indexes, int *color_table, void *frame_buffer)
#define TGL_FEATURE_RENDER_BITS
if(p1->y > p2->y||(p1->y==p2->y &&p1->x > p2->x))