mirror of
git://git.tartarus.org/simon/puzzles.git
synced 2025-04-20 23:51:29 -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:
31
rect.c
31
rect.c
@ -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,
|
||||
|
Reference in New Issue
Block a user