1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768 |
- /* 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;
- }
|