#include #include #include #include #include static void get_sizes(gint *cx, gint *cy, gint *sizes[2]) { g_print("sizes[0] = 0x%x\n", (int)(sizes[0])); if (sizes[0]) (*(sizes[0])) = (*cx) = 300; g_print("sizes[1] = 0x%x\n", (int)(sizes[1])); if (sizes[1]) (*(sizes[1])) = (*cy) = 200; } static RsvgHandle * load_svg_file(char *fname, gint *cx, gint *cy) { gsize file_length = 0; char *the_file = NULL; if (g_file_get_contents(fname, &the_file, &file_length, NULL)) { RsvgHandle *svg = rsvg_handle_new(); gint *sizes[2] = {cx, cy}; rsvg_handle_set_size_callback(svg, (RsvgSizeFunc)get_sizes, sizes, NULL); if (rsvg_handle_write(svg, (const guchar *)the_file, file_length, NULL)) { g_print("rsvg_handle_write of %d bytes has succeeded\n", file_length); return svg; } rsvg_handle_close(svg, NULL); } return NULL; } int main(int argc, char **argv) { ClutterActor *stage = NULL; ClutterActor *cairo = NULL; cairo_t *cr; RsvgHandle *svg = NULL; gint cx_svg = 0, cy_svg = 0; clutter_init(&argc, &argv); stage = clutter_stage_get_default(); clutter_container_add(CLUTTER_CONTAINER(stage), cairo = g_object_new(CLUTTER_TYPE_CAIRO, "visible", TRUE, "x", 10, "y", 10, "surface-width", 300, "surface-height", 200, NULL), NULL); cr = clutter_cairo_create(CLUTTER_CAIRO(cairo)); cairo_new_path(cr); cairo_move_to(cr, 10, 10); cairo_line_to(cr, 280, 10); cairo_line_to(cr, 280, 180); cairo_line_to(cr, 10, 180); cairo_close_path(cr); cairo_stroke(cr); g_print("&cx_svg = 0x%x and &cy_svg = 0x%x\n", (int)(&cx_svg), (int)(&cy_svg)); svg = load_svg_file("hour-hand.svg", &cx_svg, &cy_svg); g_print("svg size is [%dx%d]\n", cx_svg, cy_svg); rsvg_handle_render_cairo(svg, cr); rsvg_handle_close(svg, NULL); cairo_destroy(cr); g_object_set(G_OBJECT(stage), "visible", TRUE, NULL); clutter_main(); return 0; }