]> 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 4212e213928d14b3c86f9b82650492144c56b898..6578f1c2389e215ce04a038b9e62f9cac603eee9 100644 (file)
 #include "file-name.hh"
 #include "international.hh"
 #include "lookup.hh"            // debugging
+#include "ly-module.hh"
 #include "main.hh"
 #include "string-convert.hh"
 #include "warn.hh"
 #include "all-font-metrics.hh"
 #include "program-option.hh"
+#include "open-type-font.hh"
 
 #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 ();
@@ -199,7 +202,7 @@ Pango_font::pango_item_string_stencil (PangoGlyphItem const *glyph_item) const
 
   b.scale (scale_);
 
-  char const *ps_name_str0 = FT_Get_Postscript_Name (ftface);
+  const string ps_name_str0 = get_postscript_name (ftface);
   FcPattern *fcpat = fcfont->font_pattern;
 
   FcChar8 *file_name_as_ptr = 0;
@@ -290,7 +293,7 @@ Pango_font::pango_item_string_stencil (PangoGlyphItem const *glyph_item) const
           char_id = scm_from_uint32 (pg);
         }
       else
-        char_id = scm_from_locale_string (glyph_name);
+        char_id = scm_from_utf8_string (glyph_name);
 
       PangoRectangle logical_sub_rect;
       PangoRectangle ink_sub_rect;
@@ -319,11 +322,11 @@ Pango_font::pango_item_string_stencil (PangoGlyphItem const *glyph_item) const
   Real size = pango_font_description_get_size (descr)
               / (Real (PANGO_SCALE));
 
-  if (!ps_name_str0)
+  if (ps_name_str0.empty ())
     warning (_f ("no PostScript font name for font `%s'", file_name));
 
   string ps_name;
-  if (!ps_name_str0
+  if (ps_name_str0.empty ()
       && file_name != ""
       && (file_name.find (".otf") != NPOS
           || file_name.find (".cff") != NPOS))
@@ -350,7 +353,7 @@ Pango_font::pango_item_string_stencil (PangoGlyphItem const *glyph_item) const
       name = String_convert::to_lower (name);
       ps_name = initial + name;
     }
-  else if (ps_name_str0)
+  else if (!ps_name_str0.empty ())
     ps_name = ps_name_str0;
 
   if (ps_name.length ())
@@ -384,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
@@ -392,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);
 
@@ -440,8 +461,8 @@ Pango_font::text_stencil (Output_def * /* state */,
         variable that is bound to a *named* procedure, i.e. not a
         lambda expression.
       */
-      if (utf8_string != SCM_BOOL_F
-          && scm_procedure_name (SCM_VARIABLE_REF (utf8_string)) != SCM_BOOL_F)
+      if (scm_is_true (utf8_string)
+          && scm_is_true (scm_procedure_name (SCM_VARIABLE_REF (utf8_string))))
         has_utf8_string = true;
     }