]> git.cworth.org Git - scherzo/commitdiff
Switch to using pango, not cairo_show_text for chord names
authorCarl Worth <cworth@cworth.org>
Wed, 25 Sep 2013 22:06:36 +0000 (15:06 -0700)
committerCarl Worth <cworth@cworth.org>
Wed, 25 Sep 2013 22:06:36 +0000 (15:06 -0700)
The motivation here is to enable sub-scripting of chord symbols.

score.c

diff --git a/score.c b/score.c
index 9ef75bdf69f64e00b7a7ba248adb54e947467902..e047f979b6f77d2ba36f2146cbe74cf8f38fcc06 100644 (file)
--- 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);
 }