You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
85 lines
2.1 KiB
85 lines
2.1 KiB
#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); |
|
} |
|
|
|
|