mirror of
git://git.tartarus.org/simon/puzzles.git
synced 2025-04-20 23:51:29 -07:00
Centralise initial clearing of the puzzle window.
I don't know how I've never thought of this before! Pretty much every game in this collection has to have a mechanism for noticing when game_redraw is called for the first time on a new drawstate, and if so, start by covering the whole window with a filled rectangle of the background colour. This is a pain for implementers, and also awkward because the drawstate often has to _work out_ its own pixel size (or else remember it from when its size method was called). The backends all do that so that the frontends don't have to guarantee anything about the initial window contents. But that's a silly tradeoff to begin with (there are way more backends than frontends, so this _adds_ work rather than saving it), and also, in this code base there's a standard way to handle things you don't want to have to do in every backend _or_ every frontend: do them just once in the midend! So now that rectangle-drawing operation happens in midend_redraw, and I've been able to remove it from almost every puzzle. (A couple of puzzles have other approaches: Slant didn't have a rectangle-draw because it handles even the game borders using its per-tile redraw function, and Untangle clears the whole window on every redraw _anyway_ because it would just be too confusing not to.) In some cases I've also been able to remove the 'started' flag from the drawstate. But in many cases that has to stay because it also triggers drawing of static display furniture other than the background.
This commit is contained in:
@ -2056,14 +2056,6 @@ static void game_redraw(drawing *dr, game_drawstate *ds,
|
||||
int x, y, i, j;
|
||||
|
||||
if (!ds->started) {
|
||||
/*
|
||||
* The initial contents of the window are not guaranteed and
|
||||
* can vary with front ends. To be on the safe side, all
|
||||
* games should start by drawing a big background-colour
|
||||
* rectangle covering the whole window.
|
||||
*/
|
||||
draw_rect(dr, 0, 0, SIZE(w), SIZE(w), COL_BACKGROUND);
|
||||
|
||||
/*
|
||||
* Big containing rectangle.
|
||||
*/
|
||||
|
@ -778,13 +778,6 @@ static void game_redraw(drawing *dr, game_drawstate *ds,
|
||||
int dir, const game_ui *ui,
|
||||
float animtime, float flashtime)
|
||||
{
|
||||
/*
|
||||
* The initial contents of the window are not guaranteed and
|
||||
* can vary with front ends. To be on the safe side, all games
|
||||
* should start by drawing a big background-colour rectangle
|
||||
* covering the whole window.
|
||||
*/
|
||||
draw_rect(dr, 0, 0, 10*ds->tilesize, 10*ds->tilesize, COL_BACKGROUND);
|
||||
}
|
||||
|
||||
static float game_anim_length(const game_state *oldstate,
|
||||
|
@ -1242,7 +1242,6 @@ struct game_drawstate {
|
||||
int tilesize;
|
||||
int w, h;
|
||||
unsigned long *grid; /* what's currently displayed */
|
||||
bool started;
|
||||
};
|
||||
|
||||
static char *interpret_move(const game_state *state, game_ui *ui,
|
||||
@ -1680,7 +1679,6 @@ static game_drawstate *game_new_drawstate(drawing *dr, const game_state *state)
|
||||
ds->tilesize = 0;
|
||||
ds->w = w;
|
||||
ds->h = h;
|
||||
ds->started = false;
|
||||
ds->grid = snewn(wh, unsigned long);
|
||||
for (i = 0; i < wh; i++)
|
||||
ds->grid[i] = ~(unsigned long)0;
|
||||
@ -2129,17 +2127,6 @@ static void game_redraw(drawing *dr, game_drawstate *ds,
|
||||
int *dsf;
|
||||
int x, y, mainanchor, mainpos, dragpos, solvepos, solvesrc, solvedst;
|
||||
|
||||
if (!ds->started) {
|
||||
/*
|
||||
* The initial contents of the window are not guaranteed
|
||||
* and can vary with front ends. To be on the safe side,
|
||||
* all games should start by drawing a big
|
||||
* background-colour rectangle covering the whole window.
|
||||
*/
|
||||
draw_rect(dr, 0, 0, 10*ds->tilesize, 10*ds->tilesize, COL_BACKGROUND);
|
||||
ds->started = true;
|
||||
}
|
||||
|
||||
/*
|
||||
* Construct the board we'll be displaying (which may be
|
||||
* different from the one in state if ui describes a drag in
|
||||
|
@ -1353,15 +1353,6 @@ static void game_redraw(drawing *dr, game_drawstate *ds,
|
||||
* Initialise a fresh drawstate.
|
||||
*/
|
||||
if (!ds->started) {
|
||||
int wid, ht;
|
||||
|
||||
/*
|
||||
* Blank out the window initially.
|
||||
*/
|
||||
game_compute_size(&ds->p, TILESIZE, &wid, &ht);
|
||||
draw_rect(dr, 0, 0, wid, ht, COL_BACKGROUND);
|
||||
draw_update(dr, 0, 0, wid, ht);
|
||||
|
||||
/*
|
||||
* Draw the grid lines.
|
||||
*/
|
||||
|
Reference in New Issue
Block a user