"*ncolors: 64 \n" \
"*fpsSolid: true \n" \
+# define release_polyominoes 0
# define polyominoes_handle_event 0
# define SMOOTH_COLORS
# include "xlockmore.h" /* in xscreensaver distribution */
#ifdef USE_MODULES
ModStruct polyominoes_description = {
- "polyominoes", "init_polyominoes", "draw_polyominoes", "release_polyominoes",
+ "polyominoes", "init_polyominoes", "draw_polyominoes", (char *) NULL,
"refresh_polyominoes", "init_polyominoes", (char *) NULL, &polyominoes_opts,
6000, 1, 8192, 1, 64, 1.0, "",
"Shows attempts to place polyominoes into a rectangle", 0, NULL
#define deallocate(p,t) if ((p)!=NULL) {free(p); p=(t*)NULL;}
-static void free_polyominoes(polyominoesstruct *sp)
+static void free_polyominoes(ModeInfo * mi)
{
+ polyominoesstruct *sp = &polyominoeses[MI_SCREEN(mi)];
int n;
for (n=0;n<sp->nr_polyominoes;n++) {
}
#define set_allocate(p,type,size) p = (type *) malloc(size); \
- if ((p)==NULL) {free_polyominoes(sp);return 0;}
+ if ((p)==NULL) {free_polyominoes(mi);return 0;}
#define copy_polyomino(dst,src,new_rand) \
(dst).len=(src).len; \
*/
static
-int set_pentomino_puzzle(polyominoesstruct *sp)
+int set_pentomino_puzzle(ModeInfo * mi, polyominoesstruct *sp)
{
int perm_poly[12], perm_point[5], perm_transform[8], i, p;
*/
static
-int set_one_sided_pentomino_puzzle(polyominoesstruct *sp)
+int set_one_sided_pentomino_puzzle(ModeInfo * mi, polyominoesstruct *sp)
{
int perm_poly[18], perm_point[5], perm_transform[8], i, p;
*/
static
-int set_one_sided_hexomino_puzzle(polyominoesstruct *sp)
+int set_one_sided_hexomino_puzzle(ModeInfo * mi, polyominoesstruct *sp)
{
int perm_poly[60], perm_point[6], perm_transform[8], i, p;
*/
static
-int set_tetr_pentomino_puzzle(polyominoesstruct *sp)
+int set_tetr_pentomino_puzzle(ModeInfo * mi, polyominoesstruct *sp)
{
int perm_poly[17], perm_point[5], perm_transform[8], i, p;
*/
static
-int set_pent_hexomino_puzzle(polyominoesstruct *sp)
+int set_pent_hexomino_puzzle(ModeInfo * mi, polyominoesstruct *sp)
{
int perm_poly[47], perm_point[6], perm_transform[8], i, p;
8, {0, 1, 2, 3, 4, 5, 6, 7}, 3};
static
-int set_pentomino_puzzle1(polyominoesstruct *sp)
+int set_pentomino_puzzle1(ModeInfo * mi, polyominoesstruct *sp)
{
int perm_point[5], perm_transform[8], i, p;
8, {0, 1, 2, 3, 4, 5, 6, 7}, 4};
static
-int set_hexomino_puzzle1(polyominoesstruct *sp)
+int set_hexomino_puzzle1(ModeInfo * mi, polyominoesstruct *sp)
{
int perm_point[6], perm_transform[8], i, p;
8, {0, 1, 2, 3, 4, 5, 6, 7}, 4};
static
-int set_heptomino_puzzle1(polyominoesstruct *sp)
+int set_heptomino_puzzle1(ModeInfo * mi, polyominoesstruct *sp)
{
int perm_point[7], perm_transform[8], i, p;
*/
static
-int set_heptomino_puzzle2(polyominoesstruct *sp)
+int set_heptomino_puzzle2(ModeInfo * mi, polyominoesstruct *sp)
{
int perm_point[7], perm_transform[8], i, p;
8, {0, 1, 2, 3, 4, 5, 6, 7}, 6};
static
-int set_elevenomino_puzzle1(polyominoesstruct *sp)
+int set_elevenomino_puzzle1(ModeInfo * mi, polyominoesstruct *sp)
{
int perm_point[11], perm_transform[8], i, p;
8, {0, 1, 2, 3, 4, 5, 6, 7}, 5};
static
-int set_dekomino_puzzle1(polyominoesstruct *sp)
+int set_dekomino_puzzle1(ModeInfo * mi, polyominoesstruct *sp)
{
int perm_point[10], perm_transform[8], i, p;
8, {0, 1, 2, 3, 4, 5, 6, 7}, 5};
static
-int set_octomino_puzzle1(polyominoesstruct *sp)
+int set_octomino_puzzle1(ModeInfo * mi, polyominoesstruct *sp)
{
int perm_point[8], perm_transform[8], i, p;
*/
static
-int set_pentomino_puzzle2(polyominoesstruct *sp)
+int set_pentomino_puzzle2(ModeInfo * mi, polyominoesstruct *sp)
{
int perm_point[5], perm_transform[8], i, p;
*/
static
-int set_elevenomino_puzzle2(polyominoesstruct *sp)
+int set_elevenomino_puzzle2(ModeInfo * mi, polyominoesstruct *sp)
{
int perm_point[11], perm_transform[8], i, p;
The main functions.
**************************************************/
-#define allocate(p,type,size) p = (type *) malloc(size); if ((p)==NULL) {free_polyominoes(sp); return;}
+#define allocate(p,type,size) p = (type *) malloc(size); if ((p)==NULL) {free_polyominoes(mi); return;}
ENTRYPOINT void
init_polyominoes (ModeInfo * mi)
int box1, box2;
int *perm;
- if (polyominoeses == NULL) {
- if ((polyominoeses
- = (polyominoesstruct *) calloc(MI_NUM_SCREENS(mi),sizeof (polyominoesstruct)))
- == NULL)
- return;
- }
+ MI_INIT (mi, polyominoeses, free_polyominoes);
sp = &polyominoeses[MI_SCREEN(mi)];
- free_polyominoes(sp);
-
sp->rot180 = 0;
sp->counter = 0;
if (sp->identical) {
switch (NRAND(9)) {
case 0:
- if (!set_pentomino_puzzle1(sp))
+ if (!set_pentomino_puzzle1(mi, sp))
return;
break;
case 1:
- if (!set_hexomino_puzzle1(sp))
+ if (!set_hexomino_puzzle1(mi, sp))
return;
break;
case 2:
- if (!set_heptomino_puzzle1(sp))
+ if (!set_heptomino_puzzle1(mi, sp))
return;
break;
case 3:
- if (!set_heptomino_puzzle2(sp))
+ if (!set_heptomino_puzzle2(mi, sp))
return;
break;
case 4:
- if (!set_elevenomino_puzzle1(sp))
+ if (!set_elevenomino_puzzle1(mi, sp))
return;
break;
case 5:
- if (!set_dekomino_puzzle1(sp))
+ if (!set_dekomino_puzzle1(mi, sp))
return;
break;
case 6:
- if (!set_octomino_puzzle1(sp))
+ if (!set_octomino_puzzle1(mi, sp))
return;
break;
case 7:
- if (!set_pentomino_puzzle2(sp))
+ if (!set_pentomino_puzzle2(mi, sp))
return;
break;
case 8:
- if (!set_elevenomino_puzzle2(sp))
+ if (!set_elevenomino_puzzle2(mi, sp))
return;
break;
}
} else {
switch (NRAND(5)) {
case 0:
- if (!set_pentomino_puzzle(sp))
+ if (!set_pentomino_puzzle(mi, sp))
return;
break;
case 1:
- if (!set_one_sided_pentomino_puzzle(sp))
+ if (!set_one_sided_pentomino_puzzle(mi, sp))
return;
break;
case 2:
- if (!set_one_sided_hexomino_puzzle(sp))
+ if (!set_one_sided_hexomino_puzzle(mi, sp))
return;
break;
case 3:
- if (!set_pent_hexomino_puzzle(sp))
+ if (!set_pent_hexomino_puzzle(mi, sp))
return;
break;
case 4:
- if (!set_tetr_pentomino_puzzle(sp))
+ if (!set_tetr_pentomino_puzzle(mi, sp))
return;
break;
}
#ifdef STANDALONE
if (sp->eraser) {
sp->eraser = erase_window (MI_DISPLAY(mi), MI_WINDOW(mi), sp->eraser);
+ if (!sp->eraser)
+ init_polyominoes(mi);
return;
}
#endif
if (++sp->counter > MI_CYCLES(mi)) {
#ifdef STANDALONE
sp->eraser = erase_window (MI_DISPLAY(mi), MI_WINDOW(mi), sp->eraser);
-#endif /* STANDALONE */
+#else /* !STANDALONE */
init_polyominoes(mi);
+#endif /* !STANDALONE */
return;
}
}
if (sp->box == 0) {
#ifdef STANDALONE
sp->eraser = erase_window (MI_DISPLAY(mi), MI_WINDOW(mi), sp->eraser);
-#endif /* STANDALONE */
+#else /* !STANDALONE */
init_polyominoes(mi);
+#endif
return;
}
init_polyominoes (mi);
}
-ENTRYPOINT void
-release_polyominoes(ModeInfo * mi)
-{
- int screen;
-
- if (polyominoeses != NULL) {
- for (screen=0;screen<MI_NUM_SCREENS(mi); screen++)
- free_polyominoes(&polyominoeses[screen]);
- (void) free((void *) polyominoeses);
- polyominoeses = (polyominoesstruct *) NULL;
- }
-}
-
ENTRYPOINT void
refresh_polyominoes (ModeInfo * mi)
{