]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/pango-font.cc
Issue 1388: Initial work to support opentype font features.
[lilypond.git] / lily / pango-font.cc
index b805f34a8541eeb594f51f1aced0633f4c3dcf0e..024d7b1d576f94bd731f1186351c26832da2fafe 100644 (file)
 #if HAVE_PANGO_FT2
 #include "stencil.hh"
 
+Preinit_Pango_font::Preinit_Pango_font ()
+{
+  physical_font_tab_ = SCM_EOL;
+}
+
 Pango_font::Pango_font (PangoFT2FontMap *fontmap,
                         PangoFontDescription const *description,
                         Real output_scale)
 {
-  // This line looks stupid, but if we don't initialize physical_font_tab_ before
-  // we allocate memory in scm_c_make_hash_table, then that could trigger a garbage
-  // collection.
-  physical_font_tab_ = SCM_EOL;
   physical_font_tab_ = scm_c_make_hash_table (11);
   PangoDirection pango_dir = PANGO_DIRECTION_LTR;
   context_ = pango_context_new ();
@@ -386,7 +387,9 @@ extern bool music_strings_to_paths;
 
 Stencil
 Pango_font::text_stencil (Output_def * /* state */,
-                          const string &str, bool music_string) const
+                          const string &str,
+                          bool music_string,
+                          const string &features_str) const
 {
   /*
     The text assigned to a PangoLayout is automatically divided
@@ -394,6 +397,16 @@ Pango_font::text_stencil (Output_def * /* state */,
     Bidirectional Algorithm, if necessary.
   */
   PangoLayout *layout = pango_layout_new (context_);
+
+  if (!features_str.empty())
+    {
+      PangoAttrList *list = pango_attr_list_new();
+      PangoAttribute *features_attr = pango_attr_font_features_new(features_str.c_str());
+      pango_attr_list_insert(list, features_attr);
+      pango_layout_set_attributes(layout, list);
+      pango_attr_list_unref(list);
+    }
+
   pango_layout_set_text (layout, str.c_str (), -1);
   GSList *lines = pango_layout_get_lines (layout);