#include #include "xenon.h" #include "render.h" #include "draw.h" #include typedef struct xenon_libX11 { void* handle; int (*XFlush)(Display*); Display* (*XOpenDisplay)(const char*); Colormap (*XCreateColormap)(Display*, Window, Visual*, int); Window (*XCreateWindow)(Display*, Window, int, int, unsigned int, unsigned int, unsigned int, int, unsigned int, Visual*, unsigned long, XSetWindowAttributes*); int (*XMapRaised)(Display*, Window); } xenon_libX11; static xenon_libX11 libX11; typedef struct xenon_libGL { void* handle; XVisualInfo* (*glXChooseVisual) (Display*, int, int*); GLXContext (*glXCreateContext) (Display*, XVisualInfo*, GLXContext, Bool); Bool (*glXMakeCurrent) (Display*, GLXDrawable, GLXContext ); void (*glDrawPixels) (GLsizei, GLsizei, GLenum, GLenum, const GLvoid *); void (*glRasterPos2i) (GLint, GLint); void (*glViewport) (GLint, GLint, GLsizei, GLsizei); void (*glMatrixMode) (GLenum); void (*glLoadIdentity) (void); void (*glOrtho) (GLdouble, GLdouble, GLdouble, GLdouble, GLdouble, GLdouble); } xenon_libGL; static xenon_libGL libGL; int inhibit_rendering = 1; static void render_init_libs() { libX11.handle = dlopen("/usr/lib64/libX11.so.6", RTLD_LAZY); if (!libX11.handle) libX11.handle = dlopen("/usr/lib/libX11.so.6", RTLD_LAZY); if (!libX11.handle) printf("can't open libX11\n"); libX11.XFlush = dlsym(libX11.handle, "XFlush"); libX11.XOpenDisplay = dlsym(libX11.handle, "XOpenDisplay"); libX11.XCreateColormap = dlsym(libX11.handle, "XCreateColormap"); libX11.XCreateWindow = dlsym(libX11.handle, "XCreateWindow"); libX11.XMapRaised = dlsym(libX11.handle, "XMapRaised"); libGL.handle = dlopen("/usr/lib64/libGL.so", RTLD_LAZY); if (!libGL.handle) libGL.handle = dlopen("/usr/lib/libGL.so", RTLD_LAZY); if (!libGL.handle) libGL.handle = dlopen("/usr/lib/mesa/libGL.so.1", RTLD_LAZY); if (!libGL.handle) printf("can't open libGL\n"); libGL.glXChooseVisual = dlsym(libGL.handle, "glXChooseVisual"); libGL.glXCreateContext = dlsym(libGL.handle, "glXCreateContext"); libGL.glXMakeCurrent = dlsym(libGL.handle, "glXMakeCurrent"); libGL.glDrawPixels = dlsym(libGL.handle, "glDrawPixels"); libGL.glRasterPos2i = dlsym(libGL.handle, "glRasterPos2i"); libGL.glViewport = dlsym(libGL.handle, "glViewport"); libGL.glMatrixMode = dlsym(libGL.handle, "glMatrixMode"); libGL.glLoadIdentity = dlsym(libGL.handle, "glLoadIdentity"); libGL.glOrtho = dlsym(libGL.handle, "glOrtho"); } void render_init(int w, int h) { render_init_libs(); Display* dpy = libX11.XOpenDisplay(0); int screen = DefaultScreen(dpy); GLint glxattr[] = {GLX_RGBA, None}; XVisualInfo* vi = libGL.glXChooseVisual(dpy, screen, glxattr); GLXContext ctx = libGL.glXCreateContext(dpy, vi, 0, GL_TRUE); XSetWindowAttributes attr; attr.colormap = libX11.XCreateColormap(dpy, RootWindow(dpy, vi->screen), vi->visual, AllocNone); attr.event_mask = ExposureMask | KeyPressMask | ButtonPressMask | StructureNotifyMask; Window win = libX11.XCreateWindow(dpy, RootWindow(dpy, vi->screen), 0, 0, w, h, 0, vi->depth, InputOutput, vi->visual, CWColormap | CWEventMask, &attr); libX11.XMapRaised(dpy, win); libGL.glXMakeCurrent(dpy, win, ctx); libGL.glViewport(0, 0, w, h); libGL.glMatrixMode( GL_PROJECTION ); libGL.glLoadIdentity(); libGL.glOrtho(0.0, (GLfloat)w, 0.0, (GLfloat)h, 0.0, 2.0); libGL.glMatrixMode( GL_MODELVIEW ); libGL.glLoadIdentity(); screen_rect.x = 0; screen_rect.y = 0; screen_rect.w = w; screen_rect.h = h; pixels = (unsigned char*) malloc (w * h * 4); for(int y = 0 ; y < screen_rect.h ; y++) for(int x = 0 ; x < screen_rect.w ; x++) pixelrgba(x,y) = 0xFF501010; render_update(screen_rect); } void render_update(xenon_rect r) { inhibit_rendering = 1; for(int j = r.y ; j < r.y + r.h ; j++) { libGL.glRasterPos2i(r.x, r.h - j - 1); libGL.glDrawPixels(r.w, 1, GL_RGBA, GL_UNSIGNED_BYTE, pixels + (r.x + j * screen_rect.w) * 4 ); } inhibit_rendering = 0; }