From 659f6814cb925cfcd1db6dd1cfd92944f76991e5 Mon Sep 17 00:00:00 2001
From: Carl Worth <cworth@cworth.org>
Date: Wed, 25 Sep 2013 15:06:36 -0700
Subject: [PATCH] Switch to using pango, not cairo_show_text for chord names

The motivation here is to enable sub-scripting of chord symbols.
---
 score.c | 30 +++++++++++++++++++++++-------
 1 file changed, 23 insertions(+), 7 deletions(-)

diff --git a/score.c b/score.c
index 9ef75bd..e047f97 100644
--- a/score.c
+++ b/score.c
@@ -18,6 +18,8 @@
  * along with this program.  If not, see http://www.gnu.org/licenses/ .
  */
 
+#include <pango/pangocairo.h>
+
 #include <string.h>
 
 #include "score.h"
@@ -186,8 +188,11 @@ static void
 _draw_chord (score_t *score, cairo_t *cr,
 	     score_staff_t *staff, score_chord_t *chord)
 {
-    cairo_text_extents_t chord_extents;
+    PangoRectangle ink_extents;
+    PangoRectangle logical_extents;
     double total_staff_height;
+    PangoLayout *layout;
+    PangoFontDescription *font_description;
 
     /* XXX: The staff should manage this height itself. */
     total_staff_height = (staff->upper_ledger_lines * score->space_height +
@@ -196,19 +201,30 @@ _draw_chord (score_t *score, cairo_t *cr,
 
     cairo_save (cr);
 
-    cairo_text_extents (cr, chord->name, &chord_extents);
+    font_description = pango_font_description_new ();
+    pango_font_description_set_family (font_description, "serif");
+    pango_font_description_set_absolute_size (font_description,
+			score->space_height * 3 * PANGO_SCALE);
+
+    layout = pango_cairo_create_layout (cr);
+    pango_layout_set_font_description (layout, font_description);
+    pango_layout_set_markup (layout, chord->name, -1);
 
-    cairo_select_font_face (cr, "serif", 0, 0);
-    cairo_set_font_size (cr, score->space_height * 3);
+    pango_layout_line_get_pixel_extents (pango_layout_get_line (layout, 0),
+					 &ink_extents, &logical_extents);
 
     if (staff->clef == SCORE_CLEF_G)
 	cairo_move_to (cr, 0, - score->space_height * 0.5);
     else
-	cairo_move_to (cr, 0, score->space_height * 0.5 + total_staff_height + chord_extents.y_bearing);
+	cairo_move_to (cr, 0, score->space_height * 0.5 + total_staff_height +
+		       logical_extents.height);
+
+    pango_cairo_show_layout_line (cr, pango_layout_get_line (layout, 0));
 
-    cairo_show_text (cr, chord->name);
+    g_object_unref (layout);
+    pango_font_description_free (font_description);
 
-    chord->width = chord_extents.x_advance;
+    chord->width = logical_extents.width;
 
     cairo_restore (cr);
 }
-- 
2.45.2