graph: factor out cairo text drawing helpers

Signed-off-by: Stephen M. Cameron <stephenmcameron@gmail.com>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
diff --git a/cairo_text_helpers.c b/cairo_text_helpers.c
new file mode 100644
index 0000000..89b9aa2
--- /dev/null
+++ b/cairo_text_helpers.c
@@ -0,0 +1,85 @@
+#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 = 1.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);
+}
+