+ int k;
+
+ assert(ntoempty != 0);
+
+ setlist = snewn(ctx->w * ctx->h, int);
+ i = 0;
+ if (mask) {
+ for (dy = 0; dy < 3; dy++)
+ for (dx = 0; dx < 3; dx++)
+ if (mask & (1 << (dy*3+dx))) {
+ assert(setx+dx <= ctx->w);
+ assert(sety+dy <= ctx->h);
+ if (!ctx->grid[(sety+dy)*ctx->w+(setx+dx)])
+ setlist[i++] = (sety+dy)*ctx->w+(setx+dx);
+ }
+ } else {
+ for (y = 0; y < ctx->h; y++)
+ for (x = 0; x < ctx->w; x++)
+ if (grid[y*ctx->w+x] == -2) {
+ if (!ctx->grid[y*ctx->w+x])
+ setlist[i++] = y*ctx->w+x;
+ }
+ }
+ assert(i > ntoempty);
+ /*
+ * Now pick `ntoempty' items at random from the list.
+ */
+ for (k = 0; k < ntoempty; k++) {
+ int index = k + random_upto(ctx->rs, i - k);
+ int tmp;
+
+ tmp = setlist[k];
+ setlist[k] = setlist[index];
+ setlist[index] = tmp;
+ }
+ } else
+ setlist = NULL;