X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;ds=sidebyside;f=lily%2Fscore-engraver.cc;h=514f800c94677d0c5338554bf640622be32cb8de;hb=ca20eaa74e7e762c0611de26cc2267909ae27e02;hp=881ff8958f68593f96a823e9d3264428418dfd47;hpb=1d1f85702652995fe2531ed26a2db8756fb3b4ee;p=lilypond.git diff --git a/lily/score-engraver.cc b/lily/score-engraver.cc index 881ff8958f..514f800c94 100644 --- a/lily/score-engraver.cc +++ b/lily/score-engraver.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2004 Han-Wen Nienhuys + (c) 1997--2005 Han-Wen Nienhuys */ #include "all-font-metrics.hh" @@ -11,7 +11,6 @@ #include "warn.hh" #include "main.hh" #include "system.hh" -#include "item.hh" #include "score-engraver.hh" #include "paper-score.hh" #include "paper-column.hh" @@ -20,21 +19,18 @@ #include "context-def.hh" #include "staff-spacing.hh" #include "note-spacing.hh" -#include "context.hh" #include "global-context.hh" - - - +#include "open-type-font.hh" /* TODO: the column creation logic is rather hairy. Revise it. */ Score_engraver::Score_engraver () { - system_ =0; - command_column_ =0; - musical_column_ =0; - breaks_ =0; + system_ = 0; + command_column_ = 0; + musical_column_ = 0; + breaks_ = 0; pscore_ = 0; } @@ -49,10 +45,14 @@ Score_engraver::make_columns () SCM nmp = updated_grob_properties (context (), ly_symbol2scm ("NonMusicalPaperColumn")); + + Object_key const *key1 = context()->get_grob_key ("NonMusicalPaperColumn"); + SCM pc = updated_grob_properties (context (), ly_symbol2scm ("PaperColumn")); - - set_columns (new Paper_column (nmp), new Paper_column (pc)); + Object_key const *key2 = context()->get_grob_key ("PaperColumn"); + set_columns (new Paper_column (nmp, key1), new Paper_column (pc, key2)); + Grob_info i1; i1.grob_ = command_column_; @@ -79,46 +79,60 @@ Score_engraver::prepare (Moment m) SCM w = m.smobbed_copy (); command_column_->set_property ("when", w); musical_column_->set_property ("when", w); - + recurse_over_translators (context (), &Translator::start_translation_timestep, DOWN); } void Score_engraver::finish () { - if ((breaks_%8)) + if ((breaks_ % 8)) progress_indication ("[" + to_string (breaks_) + "]"); recurse_over_translators (context (), &Translator::finalize, UP); } +#define MUSIC_FONT "emmentaler-20" + /* use start/finish? */ void Score_engraver::initialize () { - Font_metric *fm = all_fonts_global->find_afm ("feta20"); + Font_metric *fm = all_fonts_global->find_otf (MUSIC_FONT); if (!fm) - error (_f ("can't find `%s'", "feta20.afm") - + "\n" +_ ("Music font has not been installed properly. Aborting")); - - SCM pfa_path = ly_kpathsea_expand_path (scm_makfrom0str ("ecrm10.pfa")); - if (!scm_is_string (pfa_path)) - error (_f ("can't find `%s'", "ecrm10.pfa") - + "\n" +_f ("Install the ec-mftraced package from %s. Aborting", - "http://lilypond.org/download/fonts/")); - - + { + error (_f ("cannot find `%s'", MUSIC_FONT ".otf") + + "\n" + + _ ("Music font has not been installed properly.") + + "\n" + + _f ("Search path `%s'", global_path.to_string ().to_str0()) + + "\n" + + _ ("Aborting")); + } + + if (!scm_is_string (ly_kpathsea_find_file (scm_makfrom0str ("ecrm10.pfa"))) + && (!scm_is_string (ly_kpathsea_find_file (scm_makfrom0str ("lmr10.pfb"))))) + error (_f ("cannot find `%s'", "ecrm10.pfa") + + "\n" + + _f ("cannot find `%s'", "lmr10.pfb") + + "\n" + + _f ("Install the ec-fonts-mftraced package from: %s.", + "http://lilypond.org/download/fonts/") + + "\n" + + _ ("Aborting.")); + pscore_ = new Paper_score; - pscore_->paper_ = dynamic_cast (get_output_def ()); + pscore_->layout_ = dynamic_cast (get_output_def ()); SCM props = updated_grob_properties (context (), ly_symbol2scm ("System")); - pscore_->typeset_line (new System (props)); + Object_key const *sys_key = context()->get_grob_key ("System"); + pscore_->typeset_line (new System (props, sys_key)); - make_columns (); system_ = pscore_->system_; + make_columns (); system_->set_bound (LEFT, command_column_); command_column_->set_property ("breakable", SCM_BOOL_T); @@ -164,14 +178,16 @@ Score_engraver::announce_grob (Grob_info info) void Score_engraver::typeset_all () { - for (int i =0; i < elems_.size (); i++) + for (int i = 0; i < elems_.size (); i++) { Grob * elem = elems_[i]; if (dynamic_cast (elem)) { - if (!elem->get_parent (X_AXIS) + if ( + (!elem->get_parent (X_AXIS) + || !unsmob_grob (elem->get_property ("axis-group-parent-X"))) && elem != command_column_ && elem != musical_column_ ) @@ -201,9 +217,6 @@ Score_engraver::stop_translation_timestep () progress_indication ("[" + to_string (breaks_) + "]"); } - - system_->add_column (command_column_); - system_->add_column (musical_column_); command_column_ = 0; musical_column_ = 0; @@ -226,6 +239,9 @@ Score_engraver::set_columns (Paper_column *new_command, { context ()->set_property ("currentMusicalColumn", new_musical->self_scm ()); } + + system_->add_column (command_column_); + system_->add_column (musical_column_); } Music_output* @@ -245,11 +261,11 @@ Score_engraver::try_music (Music *m) if (m->is_mus_type ("break-event")) { SCM pen = command_column_->get_property ("penalty"); - Real total_penalty = ly_c_number_p (pen) ? ly_scm2double (pen) : 0.0; + Real total_penalty = scm_is_number (pen) ? scm_to_double (pen) : 0.0; SCM mpen = m->get_property ("penalty"); - if (ly_c_number_p (mpen)) - total_penalty += ly_scm2double (mpen); + if (scm_is_number (mpen)) + total_penalty += scm_to_double (mpen); command_column_->set_property ("penalty", scm_make_real (total_penalty)); @@ -258,10 +274,10 @@ Score_engraver::try_music (Music *m) forbid_breaks (); SCM page_pen = command_column_->get_property ("page-penalty"); - Real total_pp = ly_c_number_p (page_pen) ? ly_scm2double (page_pen) : 0.0; + Real total_pp = scm_is_number (page_pen) ? scm_to_double (page_pen) : 0.0; SCM mpage_pen = m->get_property ("page-penalty"); - if (ly_c_number_p (mpage_pen)) - total_pp += ly_scm2double (mpage_pen); + if (scm_is_number (mpage_pen)) + total_pp += scm_to_double (mpage_pen); command_column_->set_property ("page-penalty", scm_make_real (total_pp)); return true; @@ -291,11 +307,27 @@ Score_engraver::acknowledge_grob (Grob_info gi) ly_symbol2scm ("spacing-wishes"), gi.grob_); } + + if (Axis_group_interface::has_interface (gi.grob_) + && gi.grob_->internal_has_interface (ly_symbol2scm ("vertically-spaceable-interface"))) + { + SCM spaceable = get_property ("verticallySpacedContexts"); + Context *orig = gi.origin_contexts (this)[0]; + + if (scm_memq (ly_symbol2scm (orig->context_name ().to_str0()), + spaceable) != SCM_BOOL_F) + { + Pointer_group_interface::add_grob (system_, + ly_symbol2scm ("spaceable-staves"), + gi.grob_); + } + } + } -ENTER_DESCRIPTION (Score_engraver, +ADD_TRANSLATOR (Score_engraver, /* descr */ "Top level engraver. Takes care of generating columns and the complete system (ie. System) " "\n\n " "This engraver decides whether a column is breakable. The default is " @@ -307,6 +339,6 @@ ENTER_DESCRIPTION (Score_engraver, , /* creats*/ "System PaperColumn NonMusicalPaperColumn", /* accepts */ "break-event", -/* acks */ "note-spacing-interface staff-spacing-interface", -/* reads */ "currentMusicalColumn currentCommandColumn", +/* acks */ "note-spacing-interface staff-spacing-interface axis-group-interface", +/* reads */ "currentMusicalColumn currentCommandColumn verticallySpacedContexts", /* write */ "");