options: warn if we fail to make sense of buffer_pattern
[fio.git] / cairo_text_helpers.c
1 #include <cairo.h>
2 #include <gtk/gtk.h>
3 #include <math.h>
4
5 static void draw_aligned_text(cairo_t *cr, const char *font, double x, double y,
6                                double fontsize, const char *text, int alignment)
7 {
8 #define CENTERED 0
9 #define LEFT_JUSTIFIED 1
10 #define RIGHT_JUSTIFIED 2
11
12         double factor, direction;
13         cairo_text_extents_t extents;
14
15         switch (alignment) {
16                 case CENTERED:
17                         direction = -1.0;
18                         factor = 0.5;
19                         break;
20                 case RIGHT_JUSTIFIED:
21                         direction = -1.0;
22                         factor = 1.0;
23                         break;
24                 case LEFT_JUSTIFIED:
25                 default:
26                         direction = 1.0;
27                         factor = 0.0;
28                         break;
29         }
30         cairo_select_font_face(cr, font, CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_NORMAL);
31
32         cairo_set_font_size(cr, fontsize);
33         cairo_text_extents(cr, text, &extents);
34         x = x + direction * (factor * extents.width  + extents.x_bearing);
35         y = y - (extents.height / 2 + extents.y_bearing);
36
37         cairo_move_to(cr, x, y);
38         cairo_show_text(cr, text);
39 }
40
41 void draw_centered_text(cairo_t *cr, const char *font, double x, double y,
42                                double fontsize, const char *text)
43 {
44         draw_aligned_text(cr, font, x, y, fontsize, text, CENTERED);
45 }
46
47 void draw_right_justified_text(cairo_t *cr, const char *font,
48                                 double x, double y,
49                                 double fontsize, const char *text)
50 {
51         draw_aligned_text(cr, font, x, y, fontsize, text, RIGHT_JUSTIFIED);
52 }
53
54 void draw_left_justified_text(cairo_t *cr, const char *font,
55                                 double x, double y,
56                                 double fontsize, const char *text)
57 {
58         draw_aligned_text(cr, font, x, y, fontsize, text, LEFT_JUSTIFIED);
59 }
60
61 void draw_vertical_centered_text(cairo_t *cr, const char *font, double x,
62                                         double y, double fontsize,
63                                         const char *text)
64 {
65         double sx, sy;
66         cairo_text_extents_t extents;
67
68         cairo_select_font_face(cr, font, CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_NORMAL);
69
70         cairo_set_font_size(cr, fontsize);
71         cairo_text_extents(cr, text, &extents);
72         sx = x;
73         sy = y;
74         y = y + (extents.width / 2.0 + extents.x_bearing);
75         x = x - (extents.height / 2.0 + extents.y_bearing);
76
77         cairo_move_to(cr, x, y);
78         cairo_save(cr);
79         cairo_translate(cr, -sx, -sy);
80         cairo_rotate(cr, -90.0 * M_PI / 180.0);
81         cairo_translate(cr, sx, sy);
82         cairo_show_text(cr, text);
83         cairo_restore(cr);
84 }
85