diff options
| author | Simon Tatham <anakin@pobox.com> | 2005-07-05 18:13:31 +0000 |
|---|---|---|
| committer | Simon Tatham <anakin@pobox.com> | 2005-07-05 18:13:31 +0000 |
| commit | b74dac6de22e783ac6619411743df6bca1755a8b (patch) | |
| tree | 3291c5880b6167a0af7625d399ae9093a1f1cdfa /cube.c | |
| parent | a4e3d69de23af4597fb1fd9a465f354a06568ffe (diff) | |
| download | puzzles-b74dac6de22e783ac6619411743df6bca1755a8b.zip puzzles-b74dac6de22e783ac6619411743df6bca1755a8b.tar.gz puzzles-b74dac6de22e783ac6619411743df6bca1755a8b.tar.bz2 puzzles-b74dac6de22e783ac6619411743df6bca1755a8b.tar.xz | |
Refactored the game_size() interface, which was getting really
unpleasant and requiring lots of special cases to be taken care of
by every single game. The new interface exposes an integer `tile
size' or `scale' parameter to the midend and provides two much
simpler routines: one which computes the pixel window size given a
game_params and a tile size, and one which is given a tile size and
must set up a drawstate appropriately. All the rest of the
complexity is handled in the midend, mostly by binary search, so
grubby special cases only have to be dealt with once.
[originally from svn r6059]
Diffstat (limited to 'cube.c')
| -rw-r--r-- | cube.c | 46 |
1 files changed, 22 insertions, 24 deletions
@@ -157,7 +157,7 @@ enum { enum { LEFT, RIGHT, UP, DOWN, UP_LEFT, UP_RIGHT, DOWN_LEFT, DOWN_RIGHT }; -#define PREFERRED_GRID_SCALE 48.0F +#define PREFERRED_GRID_SCALE 48 #define GRID_SCALE (ds->gridscale) #define ROLLTIME 0.13F @@ -1452,31 +1452,28 @@ static struct bbox find_bbox(game_params *params) return bb; } -#define XSIZE(bb, solid) \ - ((int)(((bb).r - (bb).l + 2*(solid)->border) * GRID_SCALE)) -#define YSIZE(bb, solid) \ - ((int)(((bb).d - (bb).u + 2*(solid)->border) * GRID_SCALE)) +#define XSIZE(gs, bb, solid) \ + ((int)(((bb).r - (bb).l + 2*(solid)->border) * gs)) +#define YSIZE(gs, bb, solid) \ + ((int)(((bb).d - (bb).u + 2*(solid)->border) * gs)) -static void game_size(game_params *params, game_drawstate *ds, int *x, int *y, - int expand) +static void game_compute_size(game_params *params, int tilesize, + int *x, int *y) { struct bbox bb = find_bbox(params); - float gsx, gsy, gs; - gsx = *x / (bb.r - bb.l + 2*solids[params->solid]->border); - gsy = *y / (bb.d - bb.u + 2*solids[params->solid]->border); - gs = min(gsx, gsy); - - if (expand) - ds->gridscale = gs; - else - ds->gridscale = min(gs, PREFERRED_GRID_SCALE); + *x = XSIZE(tilesize, bb, solids[params->solid]); + *y = YSIZE(tilesize, bb, solids[params->solid]); +} - ds->ox = (int)(-(bb.l - solids[params->solid]->border) * GRID_SCALE); - ds->oy = (int)(-(bb.u - solids[params->solid]->border) * GRID_SCALE); +static void game_set_size(game_drawstate *ds, game_params *params, + int tilesize) +{ + struct bbox bb = find_bbox(params); - *x = XSIZE(bb, solids[params->solid]); - *y = YSIZE(bb, solids[params->solid]); + ds->gridscale = tilesize; + ds->ox = (int)(-(bb.l - solids[params->solid]->border) * ds->gridscale); + ds->oy = (int)(-(bb.u - solids[params->solid]->border) * ds->gridscale); } static float *game_colours(frontend *fe, game_state *state, int *ncolours) @@ -1524,8 +1521,8 @@ static void game_redraw(frontend *fe, game_drawstate *ds, game_state *oldstate, game_state *newstate; int square; - draw_rect(fe, 0, 0, XSIZE(bb, state->solid), YSIZE(bb, state->solid), - COL_BACKGROUND); + draw_rect(fe, 0, 0, XSIZE(GRID_SCALE, bb, state->solid), + YSIZE(GRID_SCALE, bb, state->solid), COL_BACKGROUND); if (dir < 0) { game_state *t; @@ -1656,7 +1653,8 @@ static void game_redraw(frontend *fe, game_drawstate *ds, game_state *oldstate, } sfree(poly); - draw_update(fe, 0, 0, XSIZE(bb, state->solid), YSIZE(bb, state->solid)); + draw_update(fe, 0, 0, XSIZE(GRID_SCALE, bb, state->solid), + YSIZE(GRID_SCALE, bb, state->solid)); /* * Update the status bar. @@ -1722,7 +1720,7 @@ const struct game thegame = { game_changed_state, interpret_move, execute_move, - game_size, + PREFERRED_GRID_SCALE, game_compute_size, game_set_size, game_colours, game_new_drawstate, game_free_drawstate, |