From: Carl Worth Date: Fri, 1 Dec 2006 07:35:26 +0000 (-0800) Subject: Make rack-fancy select and display a rack of 7 random letters X-Git-Url: https://git.cworth.org/git?p=wordgame;a=commitdiff_plain;h=1478e50ab9b22ef50fb0a1be0d77a5f532eb7bd8 Make rack-fancy select and display a rack of 7 random letters The letter display uses a very cheesy effect with a radial gradient. I'll have to come up with something reasonable later. --- diff --git a/.gitignore b/.gitignore index 2e7b69f..37848f3 100644 --- a/.gitignore +++ b/.gitignore @@ -3,5 +3,6 @@ drill2 grid4 grid5 rack +rack-fancy *.o *~ diff --git a/demo-item.c b/demo-item.c index 2eaf830..b38e421 100644 --- a/demo-item.c +++ b/demo-item.c @@ -4,6 +4,8 @@ * * demo-item.c - a simple demo item. */ +#include + #include "goocanvas.h" #include "demo-item.h" @@ -31,6 +33,7 @@ goo_demo_item_new (GooCanvasItem *parent, gdouble y, gdouble width, gdouble height, + char letter, ...) { GooCanvasItem *item; @@ -45,8 +48,9 @@ goo_demo_item_new (GooCanvasItem *parent, demo_item->y = y; demo_item->width = width; demo_item->height = height; + demo_item->letter = letter; - va_start (var_args, height); + va_start (var_args, letter); first_property = va_arg (var_args, char*); if (first_property) g_object_set_valist ((GObject*) item, first_property, var_args); @@ -88,16 +92,52 @@ goo_demo_item_paint (GooCanvasItemSimple *simple, cairo_t *cr, GooCanvasBounds *bounds) { - GooDemoItem *demo_item = (GooDemoItem*) simple; + GooDemoItem *item = (GooDemoItem*) simple; + cairo_pattern_t *gradient; + cairo_text_extents_t extents; + int rad = (int) MIN (item->width / 2, item->height / 2); + int cx = item->x + item->width / 2; + int cy = item->y + item->height / 2; + double spot_angle = M_PI / 4.0; + double spot_rad = rad / 2.0; + char string[2]; + + cairo_save (cr); + + gradient = cairo_pattern_create_radial (cx - spot_rad * cos (spot_angle), + cy - spot_rad * sin (spot_angle), + 0.0, + cx - spot_rad * cos (spot_angle), + cy - spot_rad * sin (spot_angle), + rad + spot_rad); + cairo_pattern_add_color_stop_rgb (gradient, 0.0, 1.0, 1.0, 1.0); + cairo_pattern_add_color_stop_rgb (gradient, 1.0, 0.33, 0.33, 0.33); + + cairo_set_source (cr, gradient); + + cairo_arc (cr, + cx, cy, + rad, 0, 2 * M_PI); - cairo_move_to (cr, demo_item->x, demo_item->y); - cairo_line_to (cr, demo_item->x, demo_item->y + demo_item->height); - cairo_line_to (cr, demo_item->x + demo_item->width, - demo_item->y + demo_item->height); - cairo_line_to (cr, demo_item->x + demo_item->width, demo_item->y); - cairo_close_path (cr); - goo_canvas_style_set_fill_options (simple->simple_data->style, cr); cairo_fill (cr); + + cairo_select_font_face (cr, "mono", + CAIRO_FONT_SLANT_NORMAL, + CAIRO_FONT_WEIGHT_BOLD); + cairo_set_font_size (cr, 1.8 * rad); + + string[0] = item->letter; + string[1] = '\0'; + cairo_text_extents (cr, string, &extents); + cairo_move_to (cr, + cx - extents.width / 2 - extents.x_bearing, + cy - extents.height / 2 - extents.y_bearing); + + cairo_set_source_rgb (cr, 0.2, 0.3, 0.8); + cairo_show_text (cr, string); + + + cairo_restore (cr); } /* Hit detection. This should check if the given coordinate (in the item's diff --git a/demo-item.h b/demo-item.h index 81ad4b0..d7dc396 100644 --- a/demo-item.h +++ b/demo-item.h @@ -27,6 +27,7 @@ struct _GooDemoItem GooCanvasItemSimple parent_object; gdouble x, y, width, height; + char letter; }; struct _GooDemoItemClass @@ -41,6 +42,7 @@ GooCanvasItem* goo_demo_item_new (GooCanvasItem *parent, gdouble y, gdouble width, gdouble height, + char letter, ...); G_END_DECLS diff --git a/rack-fancy.c b/rack-fancy.c index 38c1253..14c8d70 100644 --- a/rack-fancy.c +++ b/rack-fancy.c @@ -16,7 +16,13 @@ * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA." */ #include +#include #include +#include +#include +#include + +#include "word-game.h" #include "demo-item.h" static gboolean @@ -61,10 +67,13 @@ on_button_press (GooCanvasItem *item, } static void -create_canvas (GtkWidget *parent) +create_canvas (GtkWidget *parent, char *word) { GtkWidget *canvas; - GooCanvasItem *root, *rect; + GooCanvasItem *root, *letter; + int i; + int item_size = 60; + int item_pad = 5; canvas = goo_canvas_new (); gtk_widget_set_size_request (canvas, 400, 400); @@ -74,25 +83,43 @@ create_canvas (GtkWidget *parent) root = goo_canvas_get_root_item (GOO_CANVAS (canvas)); - rect = goo_demo_item_new (root, 30, 20, 50, 30, - "fill-color", "purple", - NULL); - - g_signal_connect (rect, "button_press_event", - (GtkSignalFunc) on_button_press, NULL); + for (i = 0; i < strlen (word); i++) { + letter = goo_demo_item_new (root, + 30 + i * (item_size + item_pad), 20, + item_size, item_size, + word[i], + NULL); + g_signal_connect (letter, "button_press_event", + (GtkSignalFunc) on_button_press, NULL); + } } int main (int argc, char *argv[]) { + struct timeval tv; + bag_t bag; + char rack[8]; + int i; GtkWidget *window; - gtk_init (&argc, &argv); + gettimeofday (&tv, NULL); + srand (tv.tv_sec ^ tv.tv_usec); + + bag_init (&bag); + bag_shuffle (&bag); + memcpy (rack, bag.tiles, 7); + rack[7] = '\0'; + + for (i = 0; i < 7; i++) + rack[i] = toupper (rack[i]); + + gtk_init (&argc, &argv); window = create_window (); - create_canvas (window); + create_canvas (window, rack); gtk_main ();