+static void game_redraw_clue(drawing *dr, game_drawstate *ds,
+ game_state *state, int i)
+{
+ grid *g = state->game_grid;
+ grid_face *f = g->faces + i;
+ int x, y;
+ char c[3];
+
+ if (state->clues[i] < 10) {
+ c[0] = CLUE2CHAR(state->clues[i]);
+ c[1] = '\0';
+ } else {
+ sprintf(c, "%d", state->clues[i]);
+ }
+
+ face_text_pos(ds, g, f, &x, &y);
+ draw_text(dr, x, y,
+ FONT_VARIABLE, ds->tilesize/2,
+ ALIGN_VCENTRE | ALIGN_HCENTRE,
+ ds->clue_error[i] ? COL_MISTAKE :
+ ds->clue_satisfied[i] ? COL_SATISFIED : COL_FOREGROUND, c);
+}
+
+static const int loopy_line_redraw_phases[] = {
+ COL_FAINT, COL_LINEUNKNOWN, COL_FOREGROUND, COL_HIGHLIGHT, COL_MISTAKE
+};
+#define NPHASES lenof(loopy_line_redraw_phases)
+
+static void game_redraw_line(drawing *dr, game_drawstate *ds,
+ game_state *state, int i, int phase)
+{
+ grid *g = state->game_grid;
+ grid_edge *e = g->edges + i;
+ int x1, x2, y1, y2;
+ int xmin, ymin, xmax, ymax;
+ int line_colour;
+
+ if (state->line_errors[i])
+ line_colour = COL_MISTAKE;
+ else if (state->lines[i] == LINE_UNKNOWN)
+ line_colour = COL_LINEUNKNOWN;
+ else if (state->lines[i] == LINE_NO)
+ line_colour = COL_FAINT;
+ else if (ds->flashing)
+ line_colour = COL_HIGHLIGHT;
+ else
+ line_colour = COL_FOREGROUND;
+ if (line_colour != loopy_line_redraw_phases[phase])
+ return;
+
+ /* Convert from grid to screen coordinates */
+ grid_to_screen(ds, g, e->dot1->x, e->dot1->y, &x1, &y1);
+ grid_to_screen(ds, g, e->dot2->x, e->dot2->y, &x2, &y2);
+
+ xmin = min(x1, x2);
+ xmax = max(x1, x2);
+ ymin = min(y1, y2);
+ ymax = max(y1, y2);
+
+ if (line_colour == COL_FAINT) {
+ static int draw_faint_lines = -1;
+ if (draw_faint_lines < 0) {
+ char *env = getenv("LOOPY_FAINT_LINES");
+ draw_faint_lines = (!env || (env[0] == 'y' ||
+ env[0] == 'Y'));
+ }
+ if (draw_faint_lines)
+ draw_line(dr, x1, y1, x2, y2, line_colour);
+ } else {
+ draw_thick_line(dr, 3.0,
+ x1 + 0.5, y1 + 0.5,
+ x2 + 0.5, y2 + 0.5,
+ line_colour);
+ }
+}
+
+static void game_redraw_dot(drawing *dr, game_drawstate *ds,
+ game_state *state, int i)
+{
+ grid *g = state->game_grid;
+ grid_dot *d = g->dots + i;
+ int x, y;
+
+ grid_to_screen(ds, g, d->x, d->y, &x, &y);
+ draw_circle(dr, x, y, 2, COL_FOREGROUND, COL_FOREGROUND);
+}
+