mirror of
git://git.tartarus.org/simon/puzzles.git
synced 2025-04-21 08:01: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:
25
solo.c
25
solo.c
@ -2092,20 +2092,21 @@ static game_state *execute_move(game_state *from, char *move)
|
||||
#define SIZE(cr) ((cr) * TILE_SIZE + 2*BORDER + 1)
|
||||
#define GETTILESIZE(cr, w) ( (double)(w-1) / (double)(cr+1) )
|
||||
|
||||
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 c = params->c, r = params->r, cr = c*r;
|
||||
double ts;
|
||||
/* Ick: fake up `ds->tilesize' for macro expansion purposes */
|
||||
struct { int tilesize; } ads, *ds = &ads;
|
||||
ads.tilesize = tilesize;
|
||||
|
||||
ts = min(GETTILESIZE(cr, *x), GETTILESIZE(cr, *y));
|
||||
if (expand)
|
||||
ds->tilesize = (int)(ts+0.5);
|
||||
else
|
||||
ds->tilesize = min((int)ts, PREFERRED_TILE_SIZE);
|
||||
*x = SIZE(params->c * params->r);
|
||||
*y = SIZE(params->c * params->r);
|
||||
}
|
||||
|
||||
*x = SIZE(cr);
|
||||
*y = SIZE(cr);
|
||||
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)
|
||||
@ -2414,7 +2415,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