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:
Simon Tatham
2005-07-05 18:13:31 +00:00
parent a4e3d69de2
commit b74dac6de2
17 changed files with 262 additions and 268 deletions

31
rect.c
View File

@ -2499,30 +2499,23 @@ static game_state *execute_move(game_state *from, char *move)
#define COLOUR(k) ( (k)==1 ? COL_LINE : COL_DRAG )
#define MAX4(x,y,z,w) ( max(max(x,y),max(z,w)) )
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)
{
double tsx, tsy, ts;
/*
* Each window dimension equals the tile size times 1.5 more
* than the grid dimension (the border is 3/4 the width of the
* tiles).
*
* We must cast to unsigned before multiplying by two, because
* *x might be INT_MAX.
*/
tsx = 2.0 * (double)*x / (2.0 * (double)params->w + 3.0);
tsy = 2.0 * (double)*y / (2.0 * (double)params->h + 3.0);
ts = min(tsx, tsy);
if (expand)
ds->tilesize = (int)(ts + 0.5);
else
ds->tilesize = min((int)ts, PREFERRED_TILE_SIZE);
/* Ick: fake up `ds->tilesize' for macro expansion purposes */
struct { int tilesize; } ads, *ds = &ads;
ads.tilesize = tilesize;
*x = params->w * TILE_SIZE + 2*BORDER + 1;
*y = params->h * TILE_SIZE + 2*BORDER + 1;
}
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 = snewn(3 * NCOLOURS, float);
@ -2798,7 +2791,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,