#include "program-option.hh"
#include "international.hh"
#include "warn.hh"
+#include "lily-imports.hh"
static void
replace_special_characters (string &str, SCM props)
LY_ASSERT_TYPE (scm_is_string, markup, 3);
string str = ly_scm2string (markup);
- Output_def *layout = Output_def::unsmob (layout_smob);
+ Output_def *layout = unsmob<Output_def> (layout_smob);
Font_metric *fm = select_encoded_font (layout, props);
replace_special_characters (str, props);
SCM encoding = ly_chain_assoc_get (ly_symbol2scm ("font-encoding"),
props,
SCM_BOOL_F);
- SCM music_encodings = ly_lily_module_constant ("all-music-font-encodings");
+ SCM music_encodings = Lily::all_music_font_encodings;
- bool is_music = (scm_memq (encoding, music_encodings) != SCM_BOOL_F);
- return fm->text_stencil (layout, str, is_music).smobbed_copy ();
+ SCM features = ly_chain_assoc_get (ly_symbol2scm ("font-features"),
+ props,
+ SCM_BOOL_F);
+
+ // The font-features value is stored in a scheme list. This joins the entries
+ // with commas for processing with pango.
+ string features_str = string ();
+ if (scm_is_pair (features))
+ {
+ bool first = true;
+ for (SCM s = features; scm_is_pair (s); s = scm_cdr (s))
+ {
+ SCM feature = scm_car (s);
+ if (scm_is_string (feature))
+ {
+ if (first)
+ {
+ first = false;
+ }
+ else
+ {
+ features_str += ",";
+ }
+ features_str += ly_scm2string (feature);
+ }
+ else
+ {
+ scm_misc_error (__FUNCTION__, "Found non-string in font-features list", SCM_EOL);
+ }
+ }
+ }
+ else if (!scm_is_false (features))
+ {
+ scm_misc_error (__FUNCTION__, "Expecting a list for font-features value", SCM_EOL);
+ }
+
+ bool is_music = scm_is_true (scm_memq (encoding, music_encodings));
+ return fm->text_stencil (layout, str, is_music, features_str).smobbed_copy ();
}
static size_t markup_depth = 0;
scm_dynwind_unwind_handler (markup_down_depth, 0, SCM_F_WIND_EXPLICITLY);
if (markup_depth > max_depth)
{
+ scm_dynwind_end ();
string name = ly_symbol2string (scm_procedure_name (func));
// TODO: Also print the arguments of the markup!
non_fatal_error (_f ("Markup depth exceeds maximal value of %d; "
SCM
Text_interface::print (SCM grob)
{
- Grob *me = Grob::unsmob (grob);
+ Grob *me = unsmob<Grob> (grob);
SCM t = me->get_property ("text");
SCM chain = Font_interface::text_font_alist_chain (me);
bool
Text_interface::is_markup_list (SCM x)
{
- SCM music_list_p = ly_lily_module_constant ("markup-list?");
- return scm_is_true (scm_call_1 (music_list_p, x));
+ return scm_is_true (Lily::markup_list_p (x));
}
ADD_INTERFACE (Text_interface,