X-Git-Url: https://git.cworth.org/git?p=wordgame;a=blobdiff_plain;f=demo-item.c;h=198857ed5206c50412abadbe4e585207c6a5fba9;hp=0c8fc8476c5ff4ca26e80554472cc5a4cada8792;hb=HEAD;hpb=ec58ce1cd1f8effe49f12485f65c345d75767dd5 diff --git a/demo-item.c b/demo-item.c index 0c8fc84..198857e 100644 --- a/demo-item.c +++ b/demo-item.c @@ -18,54 +18,38 @@ G_DEFINE_TYPE (GooDemoItem, goo_demo_item, GOO_TYPE_CANVAS_ITEM_SIMPLE) static void goo_demo_item_init (GooDemoItem *demo_item) { - demo_item->size = 0.0; -} - -void -goo_demo_item_move_to (GooCanvasItem *item, - gdouble x, - gdouble y) -{ - cairo_matrix_t matrix; - - cairo_matrix_init_translate (&matrix, x, y); - goo_canvas_item_set_transform (item, &matrix); -} - -void -goo_demo_item_glide_to (GooCanvasItem *item, - gdouble x, - gdouble y) -{ - goo_canvas_item_animate (item, x, y, - 1.0, 0, - 500, 40, - GOO_CANVAS_ANIMATE_FREEZE); + demo_item->width = 0.0; + demo_item->height = 0.0; } /* The convenience function to create new items. This should start with a parent argument and end with a variable list of object properties to fit in with the standard canvas items. */ GooCanvasItem* -goo_demo_item_new (GooCanvasItem *parent, - gdouble x, - gdouble y, - gdouble size, - char letter, +goo_demo_item_new (GooCanvasItem *parent, + gdouble x, + gdouble y, + gdouble width, + gdouble height, + GooDemoItemPaintFunc paint, + void *closure, ...) { GooCanvasItem *item; GooDemoItem *demo_item; const char *first_property; va_list var_args; + cairo_matrix_t matrix; item = g_object_new (GOO_TYPE_DEMO_ITEM, NULL); demo_item = (GooDemoItem*) item; - demo_item->size = size; - demo_item->letter = letter; + demo_item->width = width; + demo_item->height = height; + demo_item->paint = paint; + demo_item->closure = closure; - va_start (var_args, letter); + va_start (var_args, closure); first_property = va_arg (var_args, char*); if (first_property) g_object_set_valist ((GObject*) item, first_property, var_args); @@ -77,7 +61,8 @@ goo_demo_item_new (GooCanvasItem *parent, g_object_unref (item); } - goo_demo_item_move_to (item, x, y); + cairo_matrix_init_translate (&matrix, x, y); + goo_canvas_item_set_transform (item, &matrix); return item; } @@ -95,8 +80,8 @@ goo_demo_item_update (GooCanvasItemSimple *simple, /* Compute the new bounds. */ simple->bounds.x1 = 0; simple->bounds.y1 = 0; - simple->bounds.x2 = demo_item->size; - simple->bounds.y2 = demo_item->size; + simple->bounds.x2 = demo_item->width; + simple->bounds.y2 = demo_item->height; /* Convert to device coordinates. */ goo_canvas_item_simple_user_bounds_to_device (simple, cr, &simple->bounds); @@ -110,59 +95,8 @@ goo_demo_item_paint (GooCanvasItemSimple *simple, GooCanvasBounds *bounds) { GooDemoItem *item = (GooDemoItem*) simple; - cairo_pattern_t *gradient; - cairo_text_extents_t extents; - int rad = (int) (item->size / 2); - int cx = item->size / 2; - int cy = cx; - int tx, ty; - 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_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); - tx = cx - extents.width / 2 - extents.x_bearing; - ty = cy - extents.height / 2 - extents.y_bearing; - - cairo_set_source_rgb (cr, 0.7, 0.7, 0.7); - cairo_move_to (cr, tx + 1, ty + 1); - cairo_show_text (cr, string); - - cairo_set_source_rgb (cr, 0.33, 0.33, 0.33); - cairo_move_to (cr, tx - 1, ty - 1); - cairo_show_text (cr, string); - - cairo_set_source_rgb (cr, 0.2, 0.3, 0.8); - cairo_move_to (cr, tx, ty); - cairo_show_text (cr, string); - - cairo_restore (cr); + + item->paint (cr, item->closure, item->width, item->height); } /* Hit detection. This should check if the given coordinate (in the item's @@ -177,8 +111,8 @@ goo_demo_item_get_item_at (GooCanvasItemSimple *simple, { GooDemoItem *demo_item = (GooDemoItem*) simple; - if (x < 0 || (x > demo_item->size) - || y < 0 || (y > demo_item->size)) + if (x < 0 || (x > demo_item->width) + || y < 0 || (y > demo_item->height)) return NULL; return (GooCanvasItem*) simple;