X-Git-Url: https://git.donarmstrong.com/?p=lilypond.git;a=blobdiff_plain;f=lily%2Fpango-font.cc;h=6578f1c2389e215ce04a038b9e62f9cac603eee9;hp=8fe5da409eaab2fb0ba5d81e2682eb0a68f74cde;hb=f75eceb27a4b630d4e898b1d93e3b051f969ff5e;hpb=e24fb7cc5671aea95211d4a0c56f28fb6fe8720e diff --git a/lily/pango-font.cc b/lily/pango-font.cc index 8fe5da409e..6578f1c238 100644 --- a/lily/pango-font.cc +++ b/lily/pango-font.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2004--2014 Han-Wen Nienhuys + Copyright (C) 2004--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -35,23 +35,26 @@ #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; }