aboutsummaryrefslogtreecommitdiff
path: root/samegame.c
diff options
context:
space:
mode:
authorSimon Tatham <anakin@pobox.com>2005-07-05 18:13:31 +0000
committerSimon Tatham <anakin@pobox.com>2005-07-05 18:13:31 +0000
commitb74dac6de22e783ac6619411743df6bca1755a8b (patch)
tree3291c5880b6167a0af7625d399ae9093a1f1cdfa /samegame.c
parenta4e3d69de23af4597fb1fd9a465f354a06568ffe (diff)
downloadpuzzles-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 'samegame.c')
-rw-r--r--samegame.c41
1 files changed, 12 insertions, 29 deletions
diff --git a/samegame.c b/samegame.c
index a384c0b..35f2ae2 100644
--- a/samegame.c
+++ b/samegame.c
@@ -686,36 +686,19 @@ static game_state *execute_move(game_state *from, char *move)
* Drawing routines.
*/
-static void game_size(game_params *params, game_drawstate *ds, int *x, int *y,
- int expand)
-{
- double tsx, tsy, ts;
-
- /*
- * We could choose the tile gap dynamically as well if we
- * wanted to; for example, at low tile sizes it might be
- * sensible to leave it out completely. However, for the moment
- * and for the sake of simplicity I'm just going to fix it at
- * 2.
- */
+static void game_set_size(game_drawstate *ds, game_params *params,
+ int tilesize)
+{
ds->tilegap = 2;
+ ds->tileinner = tilesize - ds->tilegap;
+}
- /*
- * Each window dimension equals the tile size (inner plus gap)
- * times the grid dimension, plus another tile size (border is
- * half the width of a tile), minus one tile gap.
- *
- * We must cast to unsigned before adding to *x and *y, since
- * they might be INT_MAX!
- */
- tsx = ((double)*x + (double)ds->tilegap) / ((double)params->w + 1.0);
- tsy = ((double)*y + (double)ds->tilegap) / ((double)params->h + 1.0);
-
- ts = min(tsx, tsy);
- if (expand)
- ds->tileinner = (int)(ts+0.5) - ds->tilegap;
- else
- ds->tileinner = min((int)ts, PREFERRED_TILE_SIZE) - ds->tilegap;
+static void game_compute_size(game_params *params, int tilesize,
+ int *x, int *y)
+{
+ /* Ick: fake up tile size variables for macro expansion purposes */
+ game_drawstate ads, *ds = &ads;
+ game_set_size(ds, params, tilesize);
*x = TILE_SIZE * params->w + 2 * BORDER - TILE_GAP;
*y = TILE_SIZE * params->h + 2 * BORDER - TILE_GAP;
@@ -1005,7 +988,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,