| /* Taken from |
| * https://developer.gnome.org/pango/stable/pango-Cairo-Rendering.html */ |
| |
| #include <math.h> |
| #include <pango/pangocairo.h> |
| static void draw_text(cairo_t* cr) |
| { |
| #define RADIUS 150 |
| #define N_WORDS 10 |
| #define FONT "Sans Bold 27" |
| PangoLayout* layout; |
| PangoFontDescription* desc; |
| int i; |
| /* Center coordinates on the middle of the region we are drawing |
| */ |
| cairo_translate(cr, RADIUS, RADIUS); |
| /* Create a PangoLayout, set the font and text */ |
| layout = pango_cairo_create_layout(cr); |
| pango_layout_set_text(layout, "Text", -1); |
| desc = pango_font_description_from_string(FONT); |
| pango_layout_set_font_description(layout, desc); |
| pango_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 */ |
| pango_cairo_update_layout(cr, layout); |
| pango_layout_get_size(layout, &width, &height); |
| cairo_move_to(cr, -((double)width / PANGO_SCALE) / 2, -RADIUS); |
| pango_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); |
| status = cairo_surface_write_to_png(surface, filename); |
| cairo_surface_destroy(surface); |
| if (status != CAIRO_STATUS_SUCCESS) { |
| g_printerr("Could not save png to '%s'\n", filename); |
| return 1; |
| } |
| return 0; |
| } |