diff options
| author | Simon Tatham <anakin@pobox.com> | 2005-06-07 17:57:50 +0000 |
|---|---|---|
| committer | Simon Tatham <anakin@pobox.com> | 2005-06-07 17:57:50 +0000 |
| commit | 02035753f817173a6861d1fc4bec437508cec42d (patch) | |
| tree | ce9bd77bcb19939150b2ffc7b53e2cd599016dd8 /solo.c | |
| parent | 69f7e7f8f5890946f4625fc071eb3f8313b17238 (diff) | |
| download | puzzles-02035753f817173a6861d1fc4bec437508cec42d.zip puzzles-02035753f817173a6861d1fc4bec437508cec42d.tar.gz puzzles-02035753f817173a6861d1fc4bec437508cec42d.tar.bz2 puzzles-02035753f817173a6861d1fc4bec437508cec42d.tar.xz | |
All the games in this collection have always defined their graphics
in terms of a constant TILE_SIZE (or equivalent). Here's a
surprisingly small patch which switches this constant into a
run-time variable.
The only observable behaviour change should be on Windows, which
physically does not permit the creation of windows larger than the
screen; if you try to create a puzzle (Net makes this plausible)
large enough to encounter this restriction, the Windows front end
should automatically re-adjust the puzzle's tile size so that it
does fit within the available space.
On GTK, I haven't done this, on the grounds that X _does_ permit
windows larger than the screen, and many X window managers already
provide the means to navigate around such a window. Gareth said he'd
rather navigate around a huge Net window than have it shrunk to fit
on one screen. I'm uncertain that this makes sense for all puzzles -
Pattern in particular strikes me as something that might be better
off shrunk to fit - so I may have to change policy later or make it
configurable.
On OS X, I also haven't done automatic shrinkage to fit on one
screen, largely because I didn't have the courage to address the
question of multiple monitors and what that means for the entire
concept :-)
[originally from svn r5913]
Diffstat (limited to 'solo.c')
| -rw-r--r-- | solo.c | 49 |
1 files changed, 30 insertions, 19 deletions
@@ -107,8 +107,9 @@ int solver_show_working; typedef unsigned char digit; #define ORDER_MAX 255 -#define TILE_SIZE 32 -#define BORDER 18 +#define PREFERRED_TILE_SIZE 32 +#define TILE_SIZE (ds->tilesize) +#define BORDER (TILE_SIZE / 2) #define FLASH_TIME 0.4F @@ -1869,6 +1870,17 @@ static void game_changed_state(game_ui *ui, game_state *oldstate, } } +struct game_drawstate { + int started; + int c, r, cr; + int tilesize; + digit *grid; + unsigned char *pencil; + unsigned char *hl; + /* This is scratch space used within a single call to game_redraw. */ + int *entered_items; +}; + static game_state *make_move(game_state *from, game_ui *ui, game_drawstate *ds, int x, int y, int button) { @@ -1972,25 +1984,23 @@ static game_state *make_move(game_state *from, game_ui *ui, game_drawstate *ds, * Drawing routines. */ -struct game_drawstate { - int started; - int c, r, cr; - digit *grid; - unsigned char *pencil; - unsigned char *hl; - /* This is scratch space used within a single call to game_redraw. */ - int *entered_items; -}; +#define SIZE(cr) ((cr) * TILE_SIZE + 2*BORDER + 1) +#define GETTILESIZE(cr, w) ( (w-1) / (cr+1) ) -#define XSIZE(cr) ((cr) * TILE_SIZE + 2*BORDER + 1) -#define YSIZE(cr) ((cr) * TILE_SIZE + 2*BORDER + 1) - -static void game_size(game_params *params, int *x, int *y) +static void game_size(game_params *params, game_drawstate *ds, + int *x, int *y, int expand) { int c = params->c, r = params->r, cr = c*r; + int ts; + + ts = min(GETTILESIZE(cr, *x), GETTILESIZE(cr, *y)); + if (expand) + ds->tilesize = ts; + else + ds->tilesize = min(ts, PREFERRED_TILE_SIZE); - *x = XSIZE(cr); - *y = YSIZE(cr); + *x = SIZE(cr); + *y = SIZE(cr); } static float *game_colours(frontend *fe, game_state *state, int *ncolours) @@ -2043,6 +2053,7 @@ static game_drawstate *game_new_drawstate(game_state *state) ds->hl = snewn(cr*cr, unsigned char); memset(ds->hl, 0, cr*cr); ds->entered_items = snewn(cr*cr, int); + ds->tilesize = 0; /* not decided yet */ return ds; } @@ -2174,7 +2185,7 @@ static void game_redraw(frontend *fe, game_drawstate *ds, game_state *oldstate, * all games should start by drawing a big * background-colour rectangle covering the whole window. */ - draw_rect(fe, 0, 0, XSIZE(cr), YSIZE(cr), COL_BACKGROUND); + draw_rect(fe, 0, 0, SIZE(cr), SIZE(cr), COL_BACKGROUND); /* * Draw the grid. @@ -2240,7 +2251,7 @@ static void game_redraw(frontend *fe, game_drawstate *ds, game_state *oldstate, * Update the _entire_ grid if necessary. */ if (!ds->started) { - draw_update(fe, 0, 0, XSIZE(cr), YSIZE(cr)); + draw_update(fe, 0, 0, SIZE(cr), SIZE(cr)); ds->started = TRUE; } } |