* Author: Carl Worth <cworth@cworth.org>
*/
+#define _GNU_SOURCE /* for vasprintf */
+#include <stdio.h>
#include <stdlib.h>
+#include <stdarg.h>
#include <gtk/gtk.h>
#include <math.h>
dvonn_bool_t has_selected;
int selected_x;
int selected_y;
+
+ PangoFontDescription *font;
};
static gboolean
/* Something like buff */
#define BACKGROUND_COLOR 0.89, 0.70, 0.40
-#define LIGHT_SQUARE_COLOR 0.89, 0.70, 0.40
-/* Something like mahogany */
-#define DARK_SQUARE_COLOR 0.26, 0.02, 0.01
+
+#define RED_RING_COLOR 0.8, 0.2, 0.2
+
+/* Relative to a unit square. */
+#define RING_OUTER_RADIUS 0.4
+#define RING_INNER_RADIUS 0.2
+#define FONT_SIZE (RING_INNER_RADIUS * 1.5)
/* XXX: This really should have an interest rectangle. */
static void
static void
ring_path (cairo_t *cr)
{
- cairo_arc (cr, 0.5, 0.5, 0.4, 0, 2 * M_PI);
- cairo_arc_negative (cr, 0.5, 0.5, 0.2, 2 * M_PI, 0);
+ cairo_new_sub_path (cr);
+ cairo_arc (cr, 0.5, 0.5, RING_OUTER_RADIUS, 0, 2 * M_PI);
+ cairo_arc_negative (cr, 0.5, 0.5, RING_INNER_RADIUS, 2 * M_PI, 0);
+}
+
+/* Some helper functions for using pango. */
+static PangoLayout *
+_create_layout (cairo_t *cr, PangoFontDescription *font, const char *text)
+{
+ PangoLayout *layout;
+
+ layout = pango_cairo_create_layout (cr);
+ pango_layout_set_font_description (layout, font);
+ pango_layout_set_text (layout, text, -1);
+ pango_layout_set_alignment (layout, PANGO_ALIGN_CENTER);
+
+ return layout;
+}
+
+#define PRINTF_FORMAT(fmt_index, va_index) __attribute__ ((__format__(__printf__, fmt_index, va_index)))
+
+static PangoLayout *
+_create_layout_vprintf (cairo_t *cr, PangoFontDescription *font, const char *fmt, va_list ap)
+{
+ PangoLayout *layout;
+ char *text;
+
+ vasprintf (&text, fmt, ap);
+
+ layout = _create_layout (cr, font, text);
+
+ free (text);
+
+ return layout;
+}
+
+static PangoLayout *
+_create_layout_printf (cairo_t *cr, PangoFontDescription *font, const char *fmt, ...)
+ PRINTF_FORMAT (3, 4);
+
+static PangoLayout *
+_create_layout_printf (cairo_t *cr, PangoFontDescription *font, const char *fmt, ...)
+{
+ va_list ap;
+ PangoLayout *layout;
+
+ va_start (ap, fmt);
+
+ layout = _create_layout_vprintf (cr, font, fmt, ap);
+
+ va_end (ap);
+
+ return layout;
+}
+
+static void
+_destroy_layout (PangoLayout *layout)
+{
+ g_object_unref (layout);
+}
+
+static void
+_show_layout (cairo_t *cr, PangoLayout *layout)
+{
+ pango_cairo_show_layout (cr, layout);
+
+ _destroy_layout (layout);
}
static gboolean
layout->x_offset = (layout->width - x_size) / 2;
layout->y_offset = (layout->height - y_size) / 2;
+
+ if (game->font == NULL) {
+ game->font = pango_font_description_new ();
+ pango_font_description_set_family (game->font, "sans");
+ }
+ pango_font_description_set_absolute_size (game->font,
+ FONT_SIZE * PANGO_SCALE);
}
cr = gdk_cairo_create (widget->window);
-
+
cairo_set_source_rgb (cr, BACKGROUND_COLOR);
cairo_paint (cr);
cairo_translate(cr,
x + (y - DVONN_BOARD_Y_SIZE/2) / 2.0,
M_SQRT1_2 * y);
+ if (cell.contains_red && cell.type != DVONN_CELL_RED) {
+ cairo_new_sub_path (cr);
+ cairo_arc (cr, 0.5, 0.5,
+ (RING_INNER_RADIUS + RING_OUTER_RADIUS)/2.0,
+ 0, 2 * M_PI);
+ cairo_set_source_rgb (cr, RED_RING_COLOR);
+ cairo_fill (cr);
+ }
ring_path (cr);
switch (cell.type) {
case DVONN_CELL_WHITE:
cairo_set_source_rgb (cr, 0.0, 0.0, 0.0); /* black */
break;
case DVONN_CELL_RED:
- cairo_set_source_rgb (cr, 0.8, 0.2, 0.2); /* red */
+ cairo_set_source_rgb (cr, RED_RING_COLOR);
break;
case DVONN_CELL_EMPTY:
default:
}
cairo_fill (cr);
+ if (game->board.cells[x][y].height > 1) {
+ PangoLayout *height;
+ cairo_move_to (cr,
+ 0.5 - 0.7 * RING_INNER_RADIUS * cos (M_PI_4),
+ 0.5 - 1.2 * RING_INNER_RADIUS * sin (M_PI_4));
+ height = _create_layout_printf (cr, game->font, "%d",
+ game->board.cells[x][y].height);
+ _show_layout (cr, height);
+ }
+
cairo_restore (cr);
}
}
game->has_selected = FALSE;
dvonn_board_init (&game->board);
+
+ game->font = NULL;
}
static void