From http://www.jwz.org/xscreensaver/xscreensaver-5.40.tar.gz
[xscreensaver] / hacks / testx11.c
index 8284d16b41c75f050cdcd279498fdbaaac78e9ac..cc2162111171ff5bdef371fb0248fc62c15d1bb8 100644 (file)
@@ -1,4 +1,4 @@
-/* testx11.c, Copyright (c) 2015-2016 Dave Odell <dmo2118@gmail.com>
+/* testx11.c, Copyright (c) 2015-2017 Dave Odell <dmo2118@gmail.com>
  *
  * Permission to use, copy, modify, distribute, and sell this software and its
  * documentation for any purpose is hereby granted without fee, provided that
 
 #include "screenhack.h"
 #include "glx/rotator.h"
+#include "colorbars.h"
+#include "erase.h"
+
+#include "ximage-loader.h"
+#include "images/gen/logo-180_png.h"
 
 #include <assert.h>
 #include <errno.h>
@@ -50,6 +55,7 @@ enum
   mode_images,
   mode_copy,
   mode_preserve,
+  mode_erase,
 
   mode_count
 };
@@ -95,6 +101,8 @@ struct testx11 {
 
   Pixmap preserve[2];
 
+  eraser_state *erase;
+
   rotator *rot;
 };
 
@@ -211,6 +219,21 @@ make_clip_mask (struct testx11 *st)
 }
 
 
+static void
+colorbars (struct testx11 *st)
+{
+  Pixmap logo_mask = 0;
+  Pixmap logo = image_data_to_pixmap (st->dpy, st->win,
+                                      logo_180_png, sizeof(logo_180_png),
+                                      0, 0, &logo_mask);
+  draw_colorbars (st->xgwa.screen, st->xgwa.visual, st->win,
+                  st->xgwa.colormap, 0, 0, st->xgwa.width, st->xgwa.height,
+                  logo, logo_mask);
+  XFreePixmap (st->dpy, logo);
+  XFreePixmap (st->dpy, logo_mask);
+}
+
+
 static void *
 testx11_init (Display *dpy, Window win)
 {
@@ -311,11 +334,11 @@ testx11_init (Display *dpy, Window win)
 
   st->copy_pix64 = XCreatePixmap(dpy, win, 64, 64, st->xgwa.depth);
 
-  st->primitives_mini_pix = XCreatePixmap (dpy, win, 16, 16, st->xgwa.depth);
+  st->primitives_mini_pix = XCreatePixmap (dpy, win, 16, 24, st->xgwa.depth);
 
   {
     static const char text[] = "Welcome from testx11_init().";
-    XClearWindow (dpy, win);
+    colorbars (st);
     XDrawString (dpy, win, st->copy_gc, 16, 16, text, countof (text) - 1);
   }
 
@@ -328,6 +351,8 @@ testx11_init (Display *dpy, Window win)
 
   toggle_antialiasing (st);
 
+  st->erase = NULL;
+
   jwxyz_assert_display (dpy);
 
   st->rot = make_rotator (2, 2, 2, 2, 0.01, False);
@@ -345,7 +370,8 @@ backdrop (struct testx11 *st, Drawable t)
     const float s0 = 2 * M_PI / tile_count;
     float y_fac = sin ((y + st->frame / 16.0) * s0);
     for (x = 0; x != tile_count; ++x) {
-      unsigned c = ((sin ((x + st->frame / 8.0) * s0) * y_fac) - 1) / 2 * st->backdrop_ncolors / 2;
+      int c = ((sin ((x + st->frame / 8.0) * s0) * y_fac) - 1) / 2 *
+              st->backdrop_ncolors / 2;
       c = (c + st->frame) % st->backdrop_ncolors;
       XSetBackground (st->dpy, st->backdrop_black_gc,
                       st->backdrop_colors[c].pixel);
@@ -690,6 +716,7 @@ testx11_draw (Display *dpy, Window win, void *st_raw)
     /* Box 2 */
     {
       XImage *image = XGetImage(st->dpy, t, 55, 55, 15, 15, 0xffffff, ZPixmap);
+      XPutPixel(image, 2, 0, 0x00000000);
       XPutImage (dpy, t, st->copy_gc, image, 0, 0, 88, 55, 15, 15);
       XDestroyImage(image);
     }
@@ -709,6 +736,7 @@ testx11_draw (Display *dpy, Window win, void *st_raw)
       XDrawPoint (dpy, t, st->copy_gc, 104 + 8, 55 + 8);
 
       XDrawPoint (dpy, st->primitives_mini_pix, st->copy_gc, 0, 0);
+      XDrawPoint (dpy, st->primitives_mini_pix, st->copy_gc, 1, 0);
       XDrawPoint (dpy, st->primitives_mini_pix, st->copy_gc, 15, 15);
       XDrawRectangle (dpy, st->primitives_mini_pix, st->copy_gc,
                       1, 1, 13, 13);
@@ -838,6 +866,12 @@ testx11_draw (Display *dpy, Window win, void *st_raw)
                preserve_size, preserve_size,
                w - preserve_size / 2, preserve_size);
     break;
+
+  case mode_erase:
+    if (!st->erase)
+      colorbars (st);
+    st->erase = erase_window(st->dpy, st->win, st->erase);
+    break;
   }
 
   /* Mode toggle buttons */