summaryrefslogtreecommitdiffstats
path: root/progs/xdemos/shape.c
diff options
context:
space:
mode:
authorEric Anholt <eric@anholt.net>2010-05-21 09:32:38 -0700
committerEric Anholt <eric@anholt.net>2010-05-21 12:20:39 -0700
commit68fc4b415e322f6744299e39864fbc377c6eff74 (patch)
tree4bafffd8b0105174f3c5c0ae327a005be9145990 /progs/xdemos/shape.c
parente4f4489e3fc0b36d72821b55794fb843b2b7fa5f (diff)
downloadexternal_mesa3d-68fc4b415e322f6744299e39864fbc377c6eff74.zip
external_mesa3d-68fc4b415e322f6744299e39864fbc377c6eff74.tar.gz
external_mesa3d-68fc4b415e322f6744299e39864fbc377c6eff74.tar.bz2
Remove demos that have moved to git+ssh://git.freedesktop.org/git/mesa/demos.
The remaining programs are ones I've had difficulty finding a build environment for to make the build system or are unit tests that should probably live next to their code instead. Hopefully people can bring over the build for remaining pieces they care about.
Diffstat (limited to 'progs/xdemos/shape.c')
-rw-r--r--progs/xdemos/shape.c393
1 files changed, 0 insertions, 393 deletions
diff --git a/progs/xdemos/shape.c b/progs/xdemos/shape.c
deleted file mode 100644
index 5ff0970..0000000
--- a/progs/xdemos/shape.c
+++ /dev/null
@@ -1,393 +0,0 @@
-
-/*
- * Example of using the X "shape" extension with OpenGL: render a spinning
- * cube inside of a non-rectangular window.
- *
- * Press ESC to exit. Press up/down to change window shape.
- *
- * To compile add "shape" to the PROGS list in Makefile.
- *
- * Brian Paul
- * June 16, 1997
- *
- * This program is in the public domain.
- */
-
-
-#include <math.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <sys/time.h>
-#include <time.h>
-#include <unistd.h>
-#include <X11/Xlib.h>
-#include <X11/Xutil.h>
-#include <X11/keysym.h>
-#include <X11/extensions/shape.h>
-#include <GL/glx.h>
-
-#ifndef PI
-#define PI 3.1415926
-#endif
-
-
-static int Width=500, Height=500;
-
-static float Xangle = 0.0, Yangle = 0.0;
-static int Sides = 5;
-static int MinSides = 3;
-static int MaxSides = 20;
-
-
-/* return current time (in seconds) */
-static double
-current_time(void)
-{
- struct timeval tv;
-#ifdef __VMS
- (void) gettimeofday(&tv, NULL );
-#else
- struct timezone tz;
- (void) gettimeofday(&tv, &tz);
-#endif
- return (double) tv.tv_sec + tv.tv_usec / 1000000.0;
-}
-
-
-/*
- * Draw the OpenGL stuff and do a SwapBuffers.
- */
-static void display(Display *dpy, Window win)
-{
- float scale = 1.7;
-
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
-
- glPushMatrix();
-
- glScalef(scale, scale, scale);
- glRotatef(Xangle, 1.0, 0.0, 0.0);
- glRotatef(Yangle, 0.0, 1.0, 0.0);
-
- /*
- * wireframe box
- */
- glColor3f(1.0, 1.0, 1.0);
- glBegin(GL_LINE_LOOP);
- glVertex3f(-1.0, -1.0, -1.0);
- glVertex3f( 1.0, -1.0, -1.0);
- glVertex3f( 1.0, 1.0, -1.0);
- glVertex3f(-1.0, 1.0, -1.0);
- glEnd();
-
- glBegin(GL_LINE_LOOP);
- glVertex3f(-1.0, -1.0, 1.0);
- glVertex3f( 1.0, -1.0, 1.0);
- glVertex3f( 1.0, 1.0, 1.0);
- glVertex3f(-1.0, 1.0, 1.0);
- glEnd();
-
- glBegin(GL_LINES);
- glVertex3f(-1.0, -1.0, -1.0); glVertex3f(-1.0, -1.0, 1.0);
- glVertex3f( 1.0, -1.0, -1.0); glVertex3f( 1.0, -1.0, 1.0);
- glVertex3f( 1.0, 1.0, -1.0); glVertex3f( 1.0, 1.0, 1.0);
- glVertex3f(-1.0, 1.0, -1.0); glVertex3f(-1.0, 1.0, 1.0);
- glEnd();
-
- /*
- * Solid box
- */
- glPushMatrix();
- glScalef(0.75, 0.75, 0.75);
-
- glColor3f(1, 0, 0);
- glBegin(GL_POLYGON);
- glVertex3f(1, -1, -1);
- glVertex3f(1, 1, -1);
- glVertex3f(1, 1, 1);
- glVertex3f(1, -1, 1);
- glEnd();
-
- glColor3f(0, 1, 1);
- glBegin(GL_POLYGON);
- glVertex3f(-1, -1, -1);
- glVertex3f(-1, 1, -1);
- glVertex3f(-1, 1, 1);
- glVertex3f(-1, -1, 1);
- glEnd();
-
- glColor3f(0, 1, 0);
- glBegin(GL_POLYGON);
- glVertex3f(-1, 1, -1);
- glVertex3f( 1, 1, -1);
- glVertex3f( 1, 1, 1);
- glVertex3f(-1, 1, 1);
- glEnd();
-
- glColor3f(1, 0, 1);
- glBegin(GL_POLYGON);
- glVertex3f(-1, -1, -1);
- glVertex3f( 1, -1, -1);
- glVertex3f( 1, -1, 1);
- glVertex3f(-1, -1, 1);
- glEnd();
-
- glColor3f(0, 0, 1);
- glBegin(GL_POLYGON);
- glVertex3f(-1, -1, 1);
- glVertex3f( 1, -1, 1);
- glVertex3f( 1, 1, 1);
- glVertex3f(-1, 1, 1);
- glEnd();
-
- glColor3f(1, 1, 0);
- glBegin(GL_POLYGON);
- glVertex3f(-1, -1, -1);
- glVertex3f( 1, -1, -1);
- glVertex3f( 1, 1, -1);
- glVertex3f(-1, 1, -1);
- glEnd();
- glPopMatrix();
-
-
- glPopMatrix();
-
- glXSwapBuffers(dpy, win);
-}
-
-
-/*
- * This is called when we have to recompute the window shape bitmask.
- * We just generate an n-sided regular polygon here but any other shape
- * would be possible.
- */
-static void make_shape_mask(Display *dpy, Window win, int width, int height,
- int sides)
-{
- Pixmap shapeMask;
- XGCValues xgcv;
- GC gc;
-
- /* allocate 1-bit deep pixmap and a GC */
- shapeMask = XCreatePixmap(dpy, win, width, height, 1);
- gc = XCreateGC(dpy, shapeMask, 0, &xgcv);
-
- /* clear shapeMask to zeros */
- XSetForeground(dpy, gc, 0);
- XFillRectangle(dpy, shapeMask, gc, 0, 0, width, height);
-
- /* draw mask */
- XSetForeground(dpy, gc, 1);
- {
- int cx = width / 2;
- int cy = height / 2;
- float angle = 0.0;
- float step = 2.0 * PI / sides;
- float radius = width / 2;
- int i;
- XPoint points[100];
- for (i=0;i<sides;i++) {
- int x = cx + radius * sin(angle);
- int y = cy - radius * cos(angle);
- points[i].x = x;
- points[i].y = y;
- angle += step;
- }
- XFillPolygon(dpy, shapeMask, gc, points, sides, Convex, CoordModeOrigin);
- }
-
- /* This is the only SHAPE extension call- simple! */
- XShapeCombineMask(dpy, win, ShapeBounding, 0, 0, shapeMask, ShapeSet);
-
- XFreeGC(dpy, gc);
- XFreePixmap(dpy, shapeMask);
-}
-
-
-/*
- * Called when window is resized. Do OpenGL viewport and projection stuff.
- */
-static void reshape(int width, int height)
-{
- glViewport(0, 0, width, height);
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
- glFrustum(-1.0, 1.0, -1.0, 1.0, 3.0, 20.0);
- glMatrixMode(GL_MODELVIEW);
- glLoadIdentity();
- glTranslatef(0.0, 0.0, -10.0);
-
- glEnable(GL_DEPTH_TEST);
-}
-
-
-/*
- * Process X events.
- */
-static void event_loop(Display *dpy, Window win)
-{
- while (1) {
- XEvent event;
- if (XPending(dpy)) {
- XNextEvent(dpy, &event);
- switch (event.type) {
- case Expose:
- display(dpy, event.xexpose.window);
- break;
- case ConfigureNotify:
- Width = event.xconfigure.width;
- Height = event.xconfigure.height,
- make_shape_mask(dpy, win, Width, Height, Sides);
- reshape(Width, Height);
- break;
- case KeyPress:
- {
- char buf[100];
- KeySym keySym;
- XComposeStatus stat;
- XLookupString(&event.xkey, buf, sizeof(buf), &keySym, &stat);
- switch (keySym) {
- case XK_Escape:
- exit(0);
- break;
- case XK_Up:
- Sides++;
- if (Sides>MaxSides) Sides = MaxSides;
- make_shape_mask(dpy, win, Width, Height, Sides);
- break;
- case XK_Down:
- Sides--;
- if (Sides<MinSides) Sides = MinSides;
- make_shape_mask(dpy, win, Width, Height, Sides);
- break;
- }
- }
- break;
- default:
- ;;
- }
- }
- else {
- static double t0 = -1.0;
- double dt, t = current_time();
- if (t0 < 0.0)
- t0 = t;
- dt = t - t0;
- Xangle += 90.0 * dt; /* 90 degrees per second */
- Yangle += 70.0 * dt;
- t0 = t;
- display(dpy, win);
- }
- }
-}
-
-
-/*
- * Allocate a "nice" colormap. This could be better (HP-CR support, etc).
- */
-static Colormap alloc_colormap(Display *dpy, Window parent, Visual *vis)
-{
- Screen *scr = DefaultScreenOfDisplay(dpy);
- int scrnum = DefaultScreen(dpy);
-
- if (MaxCmapsOfScreen(scr)==1 && vis==DefaultVisual(dpy, scrnum)) {
- /* The window and root are of the same visual type so */
- /* share the root colormap. */
- return DefaultColormap(dpy, scrnum);
- }
- else {
- return XCreateColormap(dpy, parent, vis, AllocNone);
- }
-}
-
-
-int main(int argc, char *argv[])
-{
- static int glAttribs[] = {
- GLX_DOUBLEBUFFER,
- GLX_RGBA,
- GLX_DEPTH_SIZE, 1,
- None
- };
- Display *dpy;
- XVisualInfo *visInfo;
- int scrn;
- Window root;
- Colormap cmap;
- Window win;
- XSetWindowAttributes winAttribs;
- unsigned long winAttribsMask;
- GLXContext glCtx;
- int ignore;
- const char *name = "OpenGL in a Shaped Window";
-
- dpy = XOpenDisplay(NULL);
- if (!dpy) {
- fprintf(stderr, "Couldn't open default display\n");
- return 1;
- }
-
- /* check that we can use the shape extension */
- if (!XQueryExtension(dpy, "SHAPE", &ignore, &ignore, &ignore )) {
- fprintf(stderr, "Display doesn't support shape extension\n");
- return 1;
- }
-
- scrn = DefaultScreen(dpy);
-
- root = RootWindow(dpy, scrn);
-
- visInfo = glXChooseVisual(dpy, scrn, glAttribs);
- if (!visInfo) {
- fprintf(stderr, "Couldn't get RGB, DB, Z visual\n");
- return 1;
- }
-
- glCtx = glXCreateContext(dpy, visInfo, 0, True);
- if (!glCtx) {
- fprintf(stderr, "Couldn't create GL context\n");
- return 1;
- }
-
- cmap = alloc_colormap(dpy, root, visInfo->visual);
- if (!cmap) {
- fprintf(stderr, "Couln't create colormap\n");
- return 1;
- }
-
- winAttribs.border_pixel = 0;
- winAttribs.colormap = cmap;
- winAttribs.event_mask = StructureNotifyMask | ExposureMask | KeyPressMask;
- winAttribsMask = CWBorderPixel | CWColormap | CWEventMask;
- win = XCreateWindow(dpy, root, 0, 0, Width, Height, 0,
- visInfo->depth, InputOutput,
- visInfo->visual,
- winAttribsMask, &winAttribs);
-
- {
- XSizeHints sizehints;
- /*
- sizehints.x = xpos;
- sizehints.y = ypos;
- sizehints.width = width;
- sizehints.height = height;
- */
- sizehints.flags = 0;
- XSetNormalHints(dpy, win, &sizehints);
- XSetStandardProperties(dpy, win, name, name,
- None, (char **)NULL, 0, &sizehints);
- }
-
-
- XMapWindow(dpy, win);
-
- glXMakeCurrent(dpy, win, glCtx);
-
- printf("GL_RENDERER = %s\n", (char *) glGetString(GL_RENDERER));
- printf("Press ESC to exit.\n");
- printf("Press up/down to change window shape.\n");
-
- event_loop(dpy, win);
-
- return 0;
-}