+static void symmetry_limit(game_params *params, int *xlim, int *ylim, int s)
+{
+ int c = params->c, r = params->r, cr = c*r;
+
+ switch (s) {
+ case SYMM_NONE:
+ *xlim = *ylim = cr;
+ break;
+ case SYMM_ROT2:
+ *xlim = (cr+1) / 2;
+ *ylim = cr;
+ break;
+ case SYMM_REF4:
+ case SYMM_ROT4:
+ *xlim = *ylim = (cr+1) / 2;
+ break;
+ }
+}
+
+static int symmetries(game_params *params, int x, int y, int *output, int s)
+{
+ int c = params->c, r = params->r, cr = c*r;
+ int i = 0;
+
+ *output++ = x;
+ *output++ = y;
+ i++;
+
+ switch (s) {
+ case SYMM_NONE:
+ break; /* just x,y is all we need */
+ case SYMM_REF4:
+ case SYMM_ROT4:
+ switch (s) {
+ case SYMM_REF4:
+ *output++ = cr - 1 - x;
+ *output++ = y;
+ i++;
+
+ *output++ = x;
+ *output++ = cr - 1 - y;
+ i++;
+ break;
+ case SYMM_ROT4:
+ *output++ = cr - 1 - y;
+ *output++ = x;
+ i++;
+
+ *output++ = y;
+ *output++ = cr - 1 - x;
+ i++;
+ break;
+ }
+ /* fall through */
+ case SYMM_ROT2:
+ *output++ = cr - 1 - x;
+ *output++ = cr - 1 - y;
+ i++;
+ break;
+ }
+
+ return i;
+}
+