]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/pango-font.cc
Issue 5147: Add whether to use OTF feature depending on Pango version
[lilypond.git] / lily / pango-font.cc
index b805f34a8541eeb594f51f1aced0633f4c3dcf0e..6578f1c2389e215ce04a038b9e62f9cac603eee9 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,22 @@ Pango_font::text_stencil (Output_def * /* state */,
     Bidirectional Algorithm, if necessary.
   */
   PangoLayout *layout = pango_layout_new (context_);
+
+  if (!features_str.empty())
+    {
+#if HAVE_PANGO_FT2_WITH_OTF_FEATURE
+      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);
+#else
+      warning (_f ("OpenType font feature `%s' cannot be used "
+                   "since this binary is configured without the feature.",
+                   features_str.c_str ()));
+#endif
+    }
+
   pango_layout_set_text (layout, str.c_str (), -1);
   GSList *lines = pango_layout_get_lines (layout);