/* Cairo Vala Sample Code */ using Cairo; using Gtk; using GLib; using Pango; public class CairoSample : Window { const int RADIUS = 150; const int N_WORDS = 10; const string FONT = "Sans Bold 27"; [Widget] DrawingArea drawingarea; construct { title = "Cairo Vala Demo"; destroy += Gtk.main_quit; set_default_size (RADIUS*2, RADIUS*2); create_widgets (); } public void create_widgets () { drawingarea = new DrawingArea (); drawingarea.expose_event += expose; add (drawingarea); } private bool expose (DrawingArea da, Gdk.Event event) { Cairo.Context ctx = Gdk.cairo_create (da.window); draw_demo (ctx); return true; } private static void draw_demo (Cairo.Context ctx) { ctx.set_source_rgb (1, 1, 1); ctx.paint (); ctx.set_source_rgb (0, 0, 0); /* Center coordinates on the middle of the region we are drawing */ ctx.translate (RADIUS, RADIUS); /* Create a PangoLayout, set the font and text */ Pango.Layout layout = Pango.cairo_create_layout (ctx); layout.set_text ("Text", -1); weak FontDescription desc = FontDescription.from_string (FONT); layout.set_font_description (desc); for (int i = 0; i < N_WORDS; i++) { ctx.save (); double angle = (360 * i) / N_WORDS; double red = (1 + Math.cos ((angle - 60) * Math.PI / 180)) / 2; ctx.set_source_rgb (red, 0, 1 - red); /* Rotate and re-layout the text with the new transformation */ ctx.rotate (angle * Math.PI / 180); Pango.cairo_update_layout (ctx, layout); int width, height; layout.get_size( out width, out height ); ctx.move_to ( - (width / Pango.SCALE) / 2, -RADIUS); Pango.cairo_show_layout (ctx, layout); ctx.restore (); } } static void usage () { stdout.printf("Usage: pangocairo-demo [--pdf FILENAME]\n"); } static int main (string[] args) { switch (args.length) { case 1: Gtk.init (ref args); var cairosample = new CairoSample (); cairosample.show_all (); Gtk.main (); case 2: usage (); if (args[1] != "--help") { return 1; } case 3: var format = args[1]; if (format == "--pdf") { var surface = new PdfSurface (args[2], 2 * RADIUS, 2 * RADIUS); var ctx = new Cairo.Context (surface); draw_demo (ctx); } else if (format == "--png") { var surface = new ImageSurface (Format.ARGB32, 2 * RADIUS, 2 * RADIUS); var ctx = new Cairo.Context (surface); draw_demo (ctx); surface.write_to_png (args[2]); } else if (format == "--ps") { var surface = new PsSurface (args[2], 2 * RADIUS, 2 * RADIUS); var ctx = new Cairo.Context (surface); draw_demo (ctx); } else if (format == "--svg") { var surface = new SvgSurface (args[2], 2 * RADIUS, 2 * RADIUS); var ctx = new Cairo.Context (surface); draw_demo (ctx); } else { usage (); return 1; } } return 0; } }