#include #include #define RADIUS 150 #define N_WORDS 10 #define FONT "Sans Bold 27" static void draw_text (cairo_t *cr) { Pango2Layout *layout; Pango2Lines *lines; Pango2FontDescription *desc; int i; /* Center coordinates on the middle of the region we are drawing */ cairo_translate (cr, RADIUS, RADIUS); /* Create a Pango2Layout, set the font and text */ layout = pango2_cairo_create_layout (cr); pango2_layout_set_text (layout, "Text", -1); desc = pango2_font_description_from_string (FONT); pango2_layout_set_font_description (layout, desc); pango2_font_description_free (desc); /* Draw the layout N_WORDS times in a circle */ for (i = 0; i < N_WORDS; i++) { int width, height; double angle = (360. * i) / N_WORDS; double red; cairo_save (cr); /* Gradient from red at angle == 60 to blue at angle == 240 */ red = (1 + cos ((angle - 60) * G_PI / 180.)) / 2; cairo_set_source_rgb (cr, red, 0, 1.0 - red); cairo_rotate (cr, angle * G_PI / 180.); /* Inform Pango to re-layout the text with the new transformation */ pango2_cairo_update_layout (cr, layout); lines = pango2_layout_get_lines (layout); pango2_lines_get_size (lines, &width, &height); cairo_move_to (cr, - ((double) width / PANGO2_SCALE) / 2, - RADIUS); pango2_cairo_show_layout (cr, layout); cairo_restore (cr); } /* Free the layout object */ g_object_unref (layout); } int main (int argc, char **argv) { cairo_t *cr; char *filename; cairo_status_t status; cairo_surface_t *surface; if (argc != 2) { g_printerr ("Usage: cairosimple OUTPUT_FILENAME\n"); return 1; } filename = argv[1]; surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, 2 * RADIUS, 2 * RADIUS); cr = cairo_create (surface); cairo_set_source_rgb (cr, 1.0, 1.0, 1.0); cairo_paint (cr); draw_text (cr); cairo_destroy (cr); #ifdef CAIRO_HAS_PNG_FUNCTIONS status = cairo_surface_write_to_png (surface, filename); #else status = CAIRO_STATUS_PNG_ERROR; /* Not technically correct, but... */ #endif cairo_surface_destroy (surface); if (status != CAIRO_STATUS_SUCCESS) { g_printerr ("Could not save png to '%s'\n", filename); return 1; } return 0; }