X-Git-Url: http://git.hungrycats.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=hacks%2Fpolyominoes.c;h=b87c3d33dc85e6fab7e41ffae7306d8a4b9808f5;hb=39809ded547bdbb08207d3e514950425215b4410;hp=f6a4fdc657552811cb48fb7002500426a83fac71;hpb=49f5b54f312fe4ac2e9bc47581a72451bd0e8439;p=xscreensaver diff --git a/hacks/polyominoes.c b/hacks/polyominoes.c index f6a4fdc6..b87c3d33 100644 --- a/hacks/polyominoes.c +++ b/hacks/polyominoes.c @@ -36,12 +36,14 @@ static const char sccsid[] = "@(#)polyominoes.c 5.01 2000/12/18 xlockmore"; # define MODE_polyominoes #define DEFAULTS "*delay: 10000 \n" \ "*cycles: 2000 \n" \ - "*ncolors: 64 \n" + "*ncolors: 64 \n" \ + "*fpsSolid: true \n" \ + +# define release_polyominoes 0 # define reshape_polyominoes 0 # define polyominoes_handle_event 0 # define SMOOTH_COLORS # include "xlockmore.h" /* in xscreensaver distribution */ -# include "erase.h" #else /* STANDALONE */ # include "xlock.h" /* in xlockmore distribution */ #endif /* STANDALONE */ @@ -53,6 +55,9 @@ static const char sccsid[] = "@(#)polyominoes.c 5.01 2000/12/18 xlockmore"; static Bool identical; static Bool plain; +#undef countof +#define countof(x) (sizeof((x))/sizeof((*x))) + static XrmOptionDescRec opts[] = { {"-identical", ".polyominoes.identical", XrmoptionNoArg, "on"}, @@ -77,9 +82,9 @@ ENTRYPOINT ModeSpecOpt polyominoes_opts = #ifdef USE_MODULES ModStruct polyominoes_description = { - "polyominoes", "init_polyominoes", "draw_polyominoes", "release_polyominoes", - "refresh_polyominoes", "init_polyominoes", (char *) NULL, &polyominoes_opts, - 6000, 1, 8192, 1, 64, 1.0, "", + "polyominoes", "init_polyominoes", "draw_polyominoes", (char *) NULL, + "refresh_polyominoes", "init_polyominoes", "free_polyominoes", + &polyominoes_opts, 6000, 1, 8192, 1, 64, 1.0, "", "Shows attempts to place polyominoes into a rectangle", 0, NULL }; @@ -172,10 +177,6 @@ typedef struct _polyominoesstruct{ int *reason_to_not_attach; int counter; - -#ifdef STANDALONE - eraser_state *eraser; -#endif } polyominoesstruct; #define ARRAY(x,y) (sp->array[(x)*sp->height+(y)]) @@ -509,7 +510,7 @@ static int score_point(polyominoesstruct *sp, int x, int y, int min_score_so_far) { int poly_no, point_no, transform_index, i, attachable; - point_type attach_point, target_point; + point_type attach_point = { 0, 0 }, target_point = { 0, 0 }; int score = 0; if (x>=1 && xwidth-1 && y>=1 && yheight-1 && @@ -582,7 +583,7 @@ static void detach(polyominoesstruct *sp, int *poly_no, int *point_no, int *transform_index, point_type *attach_point, int rot180) { int i; - point_type target_point; + point_type target_point = { 0, 0 }; if (sp->nr_attached == 0) return; sp->nr_attached--; @@ -610,7 +611,7 @@ void detach(polyominoesstruct *sp, int *poly_no, int *point_no, int *transform_i static int attach(polyominoesstruct *sp, int poly_no, int point_no, int transform_index, point_type attach_point, int rot180, int *reason_to_not_attach) { - point_type target_point; + point_type target_point = { 0, 0 }; int i; int attachable = 1, worst_reason_not_to_attach = 1000000000; @@ -790,7 +791,7 @@ static void create_bitmaps(ModeInfo * mi, polyominoesstruct *sp) int x,y,n; char *data; - for (n=0;n<256;n++) { + for (n=0;nbitmaps);n++) { /* Avoid duplication of identical bitmaps. */ if (IS_LEFT_UP(n) && (IS_LEFT(n) || IS_UP(n))) @@ -1029,7 +1030,7 @@ static void free_bitmaps(polyominoesstruct *sp) { int n; - for (n=0;n<256;n++) + for (n=0;nbitmaps);n++) /* Don't bother to free duplicates */ if (IS_LEFT_UP(n) && (IS_LEFT(n) || IS_UP(n))) sp->bitmaps[n] = None; @@ -1048,8 +1049,9 @@ static void free_bitmaps(polyominoesstruct *sp) #define deallocate(p,t) if ((p)!=NULL) {free(p); p=(t*)NULL;} -static void free_polyominoes(polyominoesstruct *sp) +ENTRYPOINT void free_polyominoes(ModeInfo * mi) { + polyominoesstruct *sp = &polyominoeses[MI_SCREEN(mi)]; int n; for (n=0;nnr_polyominoes;n++) { @@ -1068,7 +1070,7 @@ static void free_polyominoes(polyominoesstruct *sp) } #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; \ @@ -1499,7 +1501,7 @@ static void make_one_sided_pentomino(void) int i,j,t,u; j=0; - for (i=0;i<18;i++) { + for (i=0;i=4) { @@ -1521,7 +1523,7 @@ static void make_one_sided_hexomino(void) int i,j,t,u; j=0; - for (i=0;i<35;i++) { + for (i=0;i=4) { @@ -1542,7 +1544,7 @@ into a rectangle whose size is 20x3, 15x4, 12x5 or 10x6. */ 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; @@ -1566,9 +1568,10 @@ int set_pentomino_puzzle(polyominoesstruct *sp) } sp->nr_polyominoes = 12; - set_allocate(sp->polyomino,polyomino_type,12*sizeof(polyomino_type)); - random_permutation(12,perm_poly); - for (p=0;p<12;p++) { + set_allocate(sp->polyomino,polyomino_type, + sp->nr_polyominoes*sizeof(polyomino_type)); + random_permutation(sp->nr_polyominoes,perm_poly); + for (p=0;pnr_polyominoes;p++) { copy_polyomino(sp->polyomino[p],pentomino[perm_poly[p]],1); } @@ -1588,7 +1591,7 @@ into a rectangle. */ 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; @@ -1614,9 +1617,10 @@ int set_one_sided_pentomino_puzzle(polyominoesstruct *sp) } sp->nr_polyominoes = 18; - set_allocate(sp->polyomino,polyomino_type,18*sizeof(polyomino_type)); - random_permutation(18,perm_poly); - for (p=0;p<18;p++) { + set_allocate(sp->polyomino,polyomino_type, + sp->nr_polyominoes*sizeof(polyomino_type)); + random_permutation(sp->nr_polyominoes,perm_poly); + for (p=0;pnr_polyominoes;p++) { copy_polyomino(sp->polyomino[p],one_sided_pentomino[perm_poly[p]],1); } @@ -1631,7 +1635,7 @@ into a rectangle. */ 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; @@ -1673,9 +1677,10 @@ int set_one_sided_hexomino_puzzle(polyominoesstruct *sp) } sp->nr_polyominoes = 60; - set_allocate(sp->polyomino,polyomino_type,60*sizeof(polyomino_type)); - random_permutation(60,perm_poly); - for (p=0;p<60;p++) { + set_allocate(sp->polyomino,polyomino_type, + sp->nr_polyominoes*sizeof(polyomino_type)); + random_permutation(sp->nr_polyominoes,perm_poly); + for (p=0;pnr_polyominoes;p++) { copy_polyomino(sp->polyomino[p],one_sided_hexomino[perm_poly[p]],1); } @@ -1690,7 +1695,7 @@ pentominoes into a rectangle. */ 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; @@ -1710,12 +1715,13 @@ int set_tetr_pentomino_puzzle(polyominoesstruct *sp) } sp->nr_polyominoes = 17; - set_allocate(sp->polyomino,polyomino_type,17*sizeof(polyomino_type)); - random_permutation(17,perm_poly); - for (p=0;p<5;p++) { + set_allocate(sp->polyomino,polyomino_type, + sp->nr_polyominoes*sizeof(polyomino_type)); + random_permutation(sp->nr_polyominoes,perm_poly); + for (p=0;ppolyomino[perm_poly[p]],tetromino[p],1); } - for (p=0;p<12;p++) { + for (p=0;ppolyomino[perm_poly[p+5]],pentomino[p],1); } @@ -1729,7 +1735,7 @@ hexominoes into a rectangle whose size is 18x15. */ 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; @@ -1759,10 +1765,10 @@ int set_pent_hexomino_puzzle(polyominoesstruct *sp) sp->nr_polyominoes = 47; set_allocate(sp->polyomino,polyomino_type,47*sizeof(polyomino_type)); random_permutation(47,perm_poly); - for (p=0;p<12;p++) { + for (p=0;ppolyomino[perm_poly[p]],pentomino[p],1); } - for (p=0;p<35;p++) { + for (p=0;ppolyomino[perm_poly[p+12]],hexomino[p],1); } @@ -1791,7 +1797,7 @@ static struct {int len; point_type point[5]; 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; @@ -1799,8 +1805,9 @@ int set_pentomino_puzzle1(polyominoesstruct *sp) sp->height =5; sp->nr_polyominoes = 10; - set_allocate(sp->polyomino,polyomino_type,10*sizeof(polyomino_type)); - for (p=0;p<10;p++) { + set_allocate(sp->polyomino,polyomino_type, + sp->nr_polyominoes*sizeof(polyomino_type)); + for (p=0;pnr_polyominoes;p++) { copy_polyomino(sp->polyomino[p],pentomino1,1); } @@ -1822,7 +1829,7 @@ static struct {int len; point_type point[6]; 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; @@ -1830,8 +1837,9 @@ int set_hexomino_puzzle1(polyominoesstruct *sp) sp->height =23; sp->nr_polyominoes = 92; - set_allocate(sp->polyomino,polyomino_type,92*sizeof(polyomino_type)); - for (p=0;p<92;p++) { + set_allocate(sp->polyomino,polyomino_type, + sp->nr_polyominoes*sizeof(polyomino_type)); + for (p=0;pnr_polyominoes;p++) { copy_polyomino(sp->polyomino[p],hexomino1,1); } @@ -1855,7 +1863,7 @@ static struct {int len; point_type point[7]; 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; @@ -1865,8 +1873,9 @@ int set_heptomino_puzzle1(polyominoesstruct *sp) sp->height =21; sp->nr_polyominoes = 78; - set_allocate(sp->polyomino,polyomino_type,78*sizeof(polyomino_type)); - for (p=0;p<78;p+=2) { + set_allocate(sp->polyomino,polyomino_type, + sp->nr_polyominoes*sizeof(polyomino_type)); + for (p=0;pnr_polyominoes;p+=2) { copy_polyomino(sp->polyomino[p],heptomino1,1); copy_polyomino(sp->polyomino[p+1],heptomino1,0); } @@ -1888,7 +1897,7 @@ by Solomon W. Golomb Princeton University Press 1994 */ static -int set_heptomino_puzzle2(polyominoesstruct *sp) +int set_heptomino_puzzle2(ModeInfo * mi, polyominoesstruct *sp) { int perm_point[7], perm_transform[8], i, p; @@ -1896,8 +1905,9 @@ int set_heptomino_puzzle2(polyominoesstruct *sp) sp->height =19; sp->nr_polyominoes = 76; - set_allocate(sp->polyomino,polyomino_type,76*sizeof(polyomino_type)); - for (p=0;p<76;p++) { + set_allocate(sp->polyomino,polyomino_type, + sp->nr_polyominoes*sizeof(polyomino_type)); + for (p=0;pnr_polyominoes;p++) { copy_polyomino(sp->polyomino[p],heptomino1,1); } @@ -1922,7 +1932,7 @@ static struct {int len; point_type point[11]; 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; @@ -1932,8 +1942,9 @@ int set_elevenomino_puzzle1(polyominoesstruct *sp) sp->height =22; sp->nr_polyominoes = 50; - set_allocate(sp->polyomino,polyomino_type,50*sizeof(polyomino_type)); - for (p=0;p<50;p+=2) { + set_allocate(sp->polyomino,polyomino_type, + sp->nr_polyominoes*sizeof(polyomino_type)); + for (p=0;pnr_polyominoes;p+=2) { copy_polyomino(sp->polyomino[p],elevenomino1,1); copy_polyomino(sp->polyomino[p+1],elevenomino1,0); } @@ -1961,7 +1972,7 @@ static struct {int len; point_type point[10]; 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; @@ -1969,8 +1980,9 @@ int set_dekomino_puzzle1(polyominoesstruct *sp) sp->height =30; sp->nr_polyominoes = 96; - set_allocate(sp->polyomino,polyomino_type,96*sizeof(polyomino_type)); - for (p=0;p<96;p++) { + set_allocate(sp->polyomino,polyomino_type, + sp->nr_polyominoes*sizeof(polyomino_type)); + for (p=0;pnr_polyominoes;p++) { copy_polyomino(sp->polyomino[p],dekomino1,1); } @@ -1995,7 +2007,7 @@ static struct {int len; point_type point[10]; 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; @@ -2003,8 +2015,9 @@ int set_octomino_puzzle1(polyominoesstruct *sp) sp->height =26; sp->nr_polyominoes = 312; - set_allocate(sp->polyomino,polyomino_type,312*sizeof(polyomino_type)); - for (p=0;p<312;p++) { + set_allocate(sp->polyomino,polyomino_type, + sp->nr_polyominoes*sizeof(polyomino_type)); + for (p=0;pnr_polyominoes;p++) { copy_polyomino(sp->polyomino[p],octomino1,1); } @@ -2021,7 +2034,7 @@ int set_octomino_puzzle1(polyominoesstruct *sp) */ static -int set_pentomino_puzzle2(polyominoesstruct *sp) +int set_pentomino_puzzle2(ModeInfo * mi, polyominoesstruct *sp) { int perm_point[5], perm_transform[8], i, p; @@ -2029,8 +2042,9 @@ int set_pentomino_puzzle2(polyominoesstruct *sp) sp->height =15; sp->nr_polyominoes = 45; - set_allocate(sp->polyomino,polyomino_type,45*sizeof(polyomino_type)); - for (p=0;p<45;p++) { + set_allocate(sp->polyomino,polyomino_type, + sp->nr_polyominoes*sizeof(polyomino_type)); + for (p=0;pnr_polyominoes;p++) { copy_polyomino(sp->polyomino[p],pentomino1,1); } @@ -2048,7 +2062,7 @@ int set_pentomino_puzzle2(polyominoesstruct *sp) */ static -int set_elevenomino_puzzle2(polyominoesstruct *sp) +int set_elevenomino_puzzle2(ModeInfo * mi, polyominoesstruct *sp) { int perm_point[11], perm_transform[8], i, p; @@ -2056,8 +2070,9 @@ int set_elevenomino_puzzle2(polyominoesstruct *sp) sp->height =33; sp->nr_polyominoes = 141; - set_allocate(sp->polyomino,polyomino_type,141*sizeof(polyomino_type)); - for (p=0;p<141;p++) { + set_allocate(sp->polyomino,polyomino_type, + sp->nr_polyominoes*sizeof(polyomino_type)); + for (p=0;pnr_polyominoes;p++) { copy_polyomino(sp->polyomino[p],elevenomino1,1); } @@ -2070,7 +2085,7 @@ int set_elevenomino_puzzle2(polyominoesstruct *sp) 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) @@ -2080,16 +2095,9 @@ 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); sp = &polyominoeses[MI_SCREEN(mi)]; - free_polyominoes(sp); - sp->rot180 = 0; sp->counter = 0; @@ -2103,67 +2111,73 @@ init_polyominoes (ModeInfo * mi) 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; } } + if (MI_HEIGHT(mi) > MI_WIDTH(mi)) { /* rotate if portrait */ + int swap = sp->height; + sp->height = sp->width; + sp->width = swap; + } + allocate(sp->attach_list,int,sp->nr_polyominoes*sizeof(int)); sp->nr_attached = 0; @@ -2185,6 +2199,13 @@ init_polyominoes (ModeInfo * mi) else sp->box = box2; + if (MI_WIDTH(mi) > MI_HEIGHT(mi) * 5 || /* weird window aspect ratio */ + MI_HEIGHT(mi) > MI_WIDTH(mi)* 5) { + sp->box *= (MI_WIDTH(mi) > MI_HEIGHT(mi) + ? MI_WIDTH(mi) / (double) MI_HEIGHT(mi) + : MI_HEIGHT(mi) / (double) MI_WIDTH(mi)); + } + if (sp->box >= 12) { sp->box = (sp->box/12)*12; create_bitmaps(mi,sp); @@ -2230,10 +2251,8 @@ init_polyominoes (ModeInfo * mi) sp->wait = 0; -#ifndef STANDALONE /* Clear the background. */ MI_CLEARWINDOW(mi); -#endif } @@ -2249,27 +2268,14 @@ draw_polyominoes (ModeInfo * mi) return; sp = &polyominoeses[MI_SCREEN(mi)]; -#ifdef STANDALONE - if (sp->eraser) { - sp->eraser = erase_window (MI_DISPLAY(mi), MI_WINDOW(mi), sp->eraser); - return; - } -#endif - if (MI_CYCLES(mi) != 0) { if (++sp->counter > MI_CYCLES(mi)) { -#ifdef STANDALONE - sp->eraser = erase_window (MI_DISPLAY(mi), MI_WINDOW(mi), sp->eraser); -#endif /* STANDALONE */ init_polyominoes(mi); return; } } if (sp->box == 0) { -#ifdef STANDALONE - sp->eraser = erase_window (MI_DISPLAY(mi), MI_WINDOW(mi), sp->eraser); -#endif /* STANDALONE */ init_polyominoes(mi); return; } @@ -2349,24 +2355,13 @@ draw_polyominoes (ModeInfo * mi) sp->wait = 0; } -ENTRYPOINT void -release_polyominoes(ModeInfo * mi) -{ - int screen; - - if (polyominoeses != NULL) { - for (screen=0;screen