]> git.cworth.org Git - loa/blobdiff - loa.c
Add drawing of pieces (along with loa-board board-management code from loudgame)
[loa] / loa.c
diff --git a/loa.c b/loa.c
index 48b5b045c3fdf76e4418a03e773eb4157581fd3e..49b4f16ff63dd2cfc30b5ba2cfa8135a55a8ce2b 100644 (file)
--- a/loa.c
+++ b/loa.c
@@ -20,6 +20,8 @@
 #include <gtk/gtk.h>
 #include <math.h>
 
+#include "loa-board.h"
+
 #define BOARD_SIZE 8
 
 typedef struct {
@@ -30,6 +32,11 @@ typedef struct {
     int cell_size;
 } layout_t;
 
+typedef struct {
+    layout_t layout;
+    loa_board_t board;
+} loa_game_t;
+
 static gboolean
 on_delete_event_quit (GtkWidget  *widget,
                      GdkEvent   *event,
@@ -42,13 +49,19 @@ on_delete_event_quit (GtkWidget  *widget,
     return FALSE;
 }
 
+/* Something like buff */
+#define LIGHT_SQUARE_COLOR 0.89, 0.70, 0.40
+/* Something like mahogany */
+#define DARK_SQUARE_COLOR  0.26, 0.02, 0.01
+
 static gboolean
 on_expose_event_draw (GtkWidget                *widget,
                      GdkEventExpose    *event,
                      gpointer           user_data)
 {
+    loa_game_t *game = user_data;
+    layout_t *layout = &game->layout;
     cairo_t *cr;
-    layout_t *layout = user_data;
     int x, y;
 
     if (layout->width != widget->allocation.width ||
@@ -74,14 +87,34 @@ on_expose_event_draw (GtkWidget             *widget,
 
     for (y = 0; y < BOARD_SIZE; y++) {
        for (x = 0; x < BOARD_SIZE; x++) {
+           loa_cell_t cell;
+           cairo_save (cr);
+           cairo_translate(cr, x * layout->cell_size, y * layout->cell_size);
            if ((x + y) % 2 == 0)
-               cairo_set_source_rgb (cr, 0.89, 0.70, 0.40);
+               cairo_set_source_rgb (cr, LIGHT_SQUARE_COLOR);
            else
-               cairo_set_source_rgb (cr, 0.26, 0.02, 0.01);
-           cairo_rectangle (cr,
-                            x * layout->cell_size, y * layout->cell_size,
-                            layout->cell_size, layout->cell_size);
+               cairo_set_source_rgb (cr, DARK_SQUARE_COLOR);
+           cairo_rectangle (cr, 0, 0, layout->cell_size, layout->cell_size);
            cairo_fill (cr);
+           cell = game->board.cells[x][y];
+           if (cell != LOA_CELL_EMPTY) {
+               cairo_arc (cr,
+                          layout->cell_size / 2.0, layout->cell_size / 2.0,
+                          layout->cell_size / 2.5,
+                          0, 2 * M_PI);
+               if (cell == LOA_CELL_BLACK)
+                   cairo_set_source_rgb (cr, 0, 0, 0); /* black */
+               else
+                   cairo_set_source_rgb (cr, 1, 1, 1); /* white */
+               cairo_fill_preserve (cr);
+               cairo_set_line_width (cr, 2.0);
+               if (cell == LOA_CELL_BLACK)
+                   cairo_set_source_rgb (cr, LIGHT_SQUARE_COLOR);
+               else
+                   cairo_set_source_rgb (cr, DARK_SQUARE_COLOR);
+               cairo_stroke (cr);
+           }
+           cairo_restore (cr);
        }
     }
 
@@ -90,15 +123,23 @@ on_expose_event_draw (GtkWidget            *widget,
     return TRUE;
 }
 
+static void
+loa_game_init (loa_game_t *game)
+{
+    game->layout.width = 0;
+    game->layout.height = 0;
+
+    loa_board_init (&game->board);
+}
+
 int
 main (int argc, char *argv[])
 {
     GtkWidget *window;
     GtkWidget *drawing_area;
-    layout_t layout;
+    loa_game_t game;
 
-    layout.width = 0;
-    layout.height = 0;
+    loa_game_init (&game);
 
     gtk_init (&argc, &argv);
 
@@ -114,7 +155,7 @@ main (int argc, char *argv[])
     gtk_container_add (GTK_CONTAINER (window), drawing_area);
 
     g_signal_connect (drawing_area, "expose-event",  
-                     G_CALLBACK (on_expose_event_draw), &layout);
+                     G_CALLBACK (on_expose_event_draw), &game);
 
     gtk_widget_show_all (window);