+static void
+make_puzzle_pixmaps (struct state *st)
+{
+ int i, j;
+
+ int edges[9][4] = {
+ { -1, 1, -1, 1 }, /* CENTER */
+ { 0, 1, -1, 1 }, /* NORTH */
+ { 0, 0, -1, 1 }, /* NORTHEAST */
+ { -1, 0, -1, 1 }, /* EAST */
+ { -1, 0, 0, 1 }, /* SOUTHEAST */
+ { -1, 1, 0, 1 }, /* SOUTH */
+ { -1, 1, 0, 0 }, /* SOUTHWEST */
+ { -1, 1, -1, 0 }, /* WEST */
+ { 0, 1, -1, 0 }, /* NORTHWEST */
+ };
+
+ /* sometimes swap direction of horizontal edges */
+ if (random() & 1)
+ for (j = 0; j < countof(edges); j++) {
+ edges[j][0] = -edges[j][0];
+ edges[j][2] = -edges[j][2];
+ }
+
+ /* sometimes swap direction of vertical edges */
+ if (random() & 1)
+ for (j = 0; j < countof(edges); j++) {
+ edges[j][1] = -edges[j][1];
+ edges[j][3] = -edges[j][3];
+ }
+
+ for (j = 0; j < 9; j++) {
+ for (i = 0; i < 2; i++) {
+ int x, y;
+ int top, right, bottom, left;
+ Pixmap mask, outline;
+ top = edges[j][0];
+ right = edges[j][1];
+ bottom = edges[j][2];
+ left = edges[j][3];
+ if (i) {
+ top = -top;
+ right = -right;
+ bottom = -bottom;
+ left = -left;
+ }
+ make_puzzle_pixmap_pair (st->dpy, st->window, st->piece_width,
+ st->border_width,
+ top, right, bottom, left,
+ &x, &y, &mask, &outline);
+
+ st->all_pieces[i*2].pieces[j].x = x;
+ st->all_pieces[i*2].pieces[j].y = y;
+ st->all_pieces[i*2].pieces[j].pixmap = outline;
+
+ st->all_pieces[i*2+1].pieces[j].x = x;
+ st->all_pieces[i*2+1].pieces[j].y = y;
+ st->all_pieces[i*2+1].pieces[j].pixmap = mask;
+ }
+ }
+}
+
+static void
+free_puzzle_pixmaps (struct state *st)
+{
+ int i, j;
+ for (i = 0; i < countof(st->all_pieces); i++)
+ for (j = 0; j < countof (st->all_pieces[i].pieces); j++)
+ if (st->all_pieces[i].pieces[j].pixmap) {
+ XFreePixmap (st->dpy, st->all_pieces[i].pieces[j].pixmap);
+ st->all_pieces[i].pieces[j].pixmap = 0;
+ }
+}
+