#include <cairo.h> #include <gtk/gtk.h> #include <math.h> static void draw_aligned_text(cairo_t *cr, const char *font, double x, double y, double fontsize, const char *text, int alignment) { #define CENTERED 0 #define LEFT_JUSTIFIED 1 #define RIGHT_JUSTIFIED 2 double factor, direction; cairo_text_extents_t extents; switch (alignment) { case CENTERED: direction = -1.0; factor = 0.5; break; case RIGHT_JUSTIFIED: direction = -1.0; factor = 1.0; break; case LEFT_JUSTIFIED: default: direction = 1.0; factor = 0.0; break; } cairo_select_font_face(cr, font, CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_NORMAL); cairo_set_font_size(cr, fontsize); cairo_text_extents(cr, text, &extents); x = x + direction * (factor * extents.width + extents.x_bearing); y = y - (extents.height / 2 + extents.y_bearing); cairo_move_to(cr, x, y); cairo_show_text(cr, text); } void draw_centered_text(cairo_t *cr, const char *font, double x, double y, double fontsize, const char *text) { draw_aligned_text(cr, font, x, y, fontsize, text, CENTERED); } void draw_right_justified_text(cairo_t *cr, const char *font, double x, double y, double fontsize, const char *text) { draw_aligned_text(cr, font, x, y, fontsize, text, RIGHT_JUSTIFIED); } void draw_left_justified_text(cairo_t *cr, const char *font, double x, double y, double fontsize, const char *text) { draw_aligned_text(cr, font, x, y, fontsize, text, LEFT_JUSTIFIED); } void draw_vertical_centered_text(cairo_t *cr, const char *font, double x, double y, double fontsize, const char *text) { double sx, sy; cairo_text_extents_t extents; cairo_select_font_face(cr, font, CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_NORMAL); cairo_set_font_size(cr, fontsize); cairo_text_extents(cr, text, &extents); sx = x; sy = y; y = y + (extents.width / 2.0 + extents.x_bearing); x = x - (extents.height / 2.0 + extents.y_bearing); cairo_move_to(cr, x, y); cairo_save(cr); cairo_translate(cr, -sx, -sy); cairo_rotate(cr, -90.0 * M_PI / 180.0); cairo_translate(cr, sx, sy); cairo_show_text(cr, text); cairo_restore(cr); }