/** canvasaffine.c **/ #include gint eventDelete(GtkWidget *widget, GdkEvent *event,gpointer data); gint eventDestroy(GtkWidget *widget, GdkEvent *event,gpointer data); GnomeCanvasPoints *makeOriginArrow(gint h,gint v); #define HORIZ 30 #define VERT 30 #define WIDTH (HORIZ * 6) #define HEIGHT (VERT * 6) int main(int argc,char *argv[]) { GtkWidget *app; GtkWidget *canvas; GnomeCanvasGroup *rootGroup; GnomeCanvasItem *item; double affine[6]; gnome_init("canvasaffine","1.0",argc,argv); app = gnome_app_new("canvasaffine", "Canvas Affine"); gtk_signal_connect(GTK_OBJECT(app),"delete_event", GTK_SIGNAL_FUNC(eventDelete),NULL); gtk_signal_connect(GTK_OBJECT(app),"destroy", GTK_SIGNAL_FUNC(eventDestroy),NULL); canvas = gnome_canvas_new(); gtk_widget_set_usize(canvas,WIDTH,HEIGHT); gnome_canvas_set_scroll_region(GNOME_CANVAS(canvas), -WIDTH/2,-HEIGHT/2,WIDTH/2,HEIGHT/2); rootGroup = gnome_canvas_root(GNOME_CANVAS(canvas)); gnome_app_set_contents(GNOME_APP(app),canvas); item = gnome_canvas_item_new(rootGroup, gnome_canvas_polygon_get_type(), "points",makeOriginArrow(HORIZ,VERT), "fill_color","white", "outline_color","black", NULL); art_affine_scale(affine,1.3,1.3); gnome_canvas_item_affine_relative(item,affine); item = gnome_canvas_item_new(rootGroup, gnome_canvas_polygon_get_type(), "points",makeOriginArrow(HORIZ/2,VERT/2), "fill_color","black", "outline_color","white", NULL); art_affine_rotate(affine,45.0); gnome_canvas_item_affine_relative(item,affine); item = gnome_canvas_item_new(rootGroup, gnome_canvas_polygon_get_type(), "points",makeOriginArrow(HORIZ/2,VERT/2), "fill_color","green", "outline_color","black", NULL); art_affine_translate(affine,60,-50); gnome_canvas_item_affine_relative(item,affine); gtk_widget_show_all(app); gtk_main(); exit(0); } GnomeCanvasPoints *makeOriginArrow(gint h,gint v) { int i; GnomeCanvasPoints *points; static const gint xy[16] = { 0,-2, -2,0, -1,0, -1,2, 1,2, 1,0, 2,0, 0,-2 }; points = gnome_canvas_points_new(8); for(i=0; i<16; i += 2) { points->coords[i] = (xy[i] * h); points->coords[i+1] = (xy[i+1] * v); } return(points); } gint eventDelete(GtkWidget *widget, GdkEvent *event,gpointer data) { return(FALSE); } gint eventDestroy(GtkWidget *widget, GdkEvent *event,gpointer data) { gtk_main_quit(); return(0); }