mirror of
git://git.tartarus.org/simon/puzzles.git
synced 2025-04-20 15:41:30 -07:00
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]
This commit is contained in:
30
netslide.c
30
netslide.c
@ -1194,29 +1194,23 @@ static void game_free_drawstate(game_drawstate *ds)
|
||||
sfree(ds);
|
||||
}
|
||||
|
||||
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)
|
||||
{
|
||||
int tsx, tsy, ts;
|
||||
/*
|
||||
* Each window dimension equals the tile size times two more
|
||||
* than the grid dimension (the border containing the arrows is
|
||||
* the same width as the tiles), plus TILE_BORDER, plus twice
|
||||
* WINDOW_OFFSET.
|
||||
*/
|
||||
tsx = (*x - 2*WINDOW_OFFSET - TILE_BORDER) / (params->width + 2);
|
||||
tsy = (*y - 2*WINDOW_OFFSET - TILE_BORDER) / (params->height + 2);
|
||||
ts = min(tsx, tsy);
|
||||
|
||||
if (expand)
|
||||
ds->tilesize = ts;
|
||||
else
|
||||
ds->tilesize = min(ts, PREFERRED_TILE_SIZE);
|
||||
/* Ick: fake up `ds->tilesize' for macro expansion purposes */
|
||||
struct { int tilesize; } ads, *ds = &ads;
|
||||
ads.tilesize = tilesize;
|
||||
|
||||
*x = BORDER * 2 + WINDOW_OFFSET * 2 + TILE_SIZE * params->width + TILE_BORDER;
|
||||
*y = BORDER * 2 + WINDOW_OFFSET * 2 + TILE_SIZE * params->height + TILE_BORDER;
|
||||
}
|
||||
|
||||
static void game_set_size(game_drawstate *ds, game_params *params,
|
||||
int tilesize)
|
||||
{
|
||||
ds->tilesize = tilesize;
|
||||
}
|
||||
|
||||
static float *game_colours(frontend *fe, game_state *state, int *ncolours)
|
||||
{
|
||||
float *ret;
|
||||
@ -1815,7 +1809,7 @@ const struct game thegame = {
|
||||
game_changed_state,
|
||||
interpret_move,
|
||||
execute_move,
|
||||
game_size,
|
||||
PREFERRED_TILE_SIZE, game_compute_size, game_set_size,
|
||||
game_colours,
|
||||
game_new_drawstate,
|
||||
game_free_drawstate,
|
||||
|
Reference in New Issue
Block a user