+#undef presult
+#endif
+
+
+void
+grabTexture(void)
+{
+ int real_width = gflux->modeinfo->xgwa.width;
+ int real_height = gflux->modeinfo->xgwa.height;
+ XImage *ximage = screen_to_ximage (gflux->modeinfo->xgwa.screen,
+ gflux->window);
+ Bool bigimage = False;
+ int size = 0;
+
+ if (ximage->width > 1280 || /* that's too damned big... */
+ ximage->height > 1280)
+ {
+ Display *dpy = gflux->modeinfo->dpy;
+ Visual *v = gflux->modeinfo->xgwa.visual;
+ int real_size = (ximage->width < ximage->height ?
+ real_width : real_height);
+ XImage *x2;
+ int x, y, xoff, yoff;
+ size = (ximage->width < ximage->height ?
+ ximage->width : ximage->height);
+ bigimage = True;
+
+ if (size > 1024) size = 1024;
+
+ x2 = XCreateImage (dpy, v, 32, ZPixmap, 0, 0, size, size, 32, 0);
+ xoff = (real_width > size ? (random() % (real_width - size)) : 0);
+ yoff = (real_height > size ? (random() % (real_height - size)) : 0);
+
+# if 0
+ fprintf(stderr, "%s: cropping texture from %dx%d to %dx%d @ %d,%d\n",
+ progname, ximage->width, ximage->height, x2->width, x2->height,
+ xoff, yoff);
+# endif
+ x2->data = ximage->data; /* we can reuse the same array */
+ for (y = 0; y < x2->height; y++)
+ for (x = 0; x < x2->width; x++)
+ XPutPixel (x2, x, y, XGetPixel (ximage, x+xoff, y+yoff));
+
+ real_width = real_height = real_size;
+ ximage->data = 0;
+ XDestroyImage (ximage);
+ ximage = x2;
+ }
+
+ /* Add a border. */
+ {
+ unsigned long gray = 0xAAAAAAAAL; /* so shoot me */
+ int width = (bigimage ? size : real_width);
+ int height = (bigimage ? size : real_height);
+ int i;
+ for (i = 0; i < real_height; i++)
+ {
+ XPutPixel (ximage, 0, i, gray);
+ XPutPixel (ximage, width-1, i, gray);
+ }
+ for (i = 0; i < real_width; i++)
+ {
+ XPutPixel (ximage, i, 0, gray);
+ XPutPixel (ximage, i, height-1, gray);
+ }
+ }
+
+ gflux->imageWidth = ximage->width;
+ gflux->imageHeight = ximage->height;
+ gflux->image = ximage->data;
+
+ if (bigimage) /* don't scale really large images */
+ {
+ gflux->tex_xscale = 1;
+ gflux->tex_yscale = 1;
+ }
+ else
+ {
+ gflux->tex_xscale = ((GLfloat) real_width / (GLfloat) ximage->width);
+ gflux->tex_yscale = ((GLfloat) real_height / (GLfloat) ximage->height);
+ }
+
+ ximage->data = 0;
+ XDestroyImage (ximage);
+}
+
+