X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fscore-engraver.cc;h=6feb5be1f274f2d006cfc153ba9ce518deb3a204;hb=c2d44e3a71b2d031305abede97a53f6e5fcf832b;hp=c6748a34528651bed3623863e7cadd690d955265;hpb=e37010af17faa8b185de836664b6544bd29dc1d0;p=lilypond.git diff --git a/lily/score-engraver.cc b/lily/score-engraver.cc index c6748a3452..6feb5be1f2 100644 --- a/lily/score-engraver.cc +++ b/lily/score-engraver.cc @@ -15,7 +15,7 @@ #include "score-engraver.hh" #include "paper-score.hh" #include "paper-column.hh" -#include "paper-def.hh" +#include "output-def.hh" #include "axis-group-interface.hh" #include "context-def.hh" #include "staff-spacing.hh" @@ -47,9 +47,9 @@ Score_engraver::make_columns () if (!command_column_) { SCM nmp - = updated_grob_properties (daddy_context_, + = updated_grob_properties (context (), ly_symbol2scm ("NonMusicalPaperColumn")); - SCM pc = updated_grob_properties (daddy_context_, + SCM pc = updated_grob_properties (context (), ly_symbol2scm ("PaperColumn")); set_columns (new Paper_column (nmp), new Paper_column (pc)); @@ -77,10 +77,10 @@ Score_engraver::prepare (Moment m) make_columns (); SCM w = m.smobbed_copy (); - command_column_->set_grob_property ("when", w); - musical_column_->set_grob_property ("when", w); + command_column_->set_property ("when", w); + musical_column_->set_property ("when", w); - recurse_down_translators (daddy_context_, &Translator::start_translation_timestep, false); + recurse_over_translators (context (), &Translator::start_translation_timestep, DOWN); } void @@ -89,7 +89,7 @@ Score_engraver::finish () if ((breaks_%8)) progress_indication ("[" + to_string (breaks_) + "]"); - recurse_down_translators (daddy_context_, &Translator::finalize, true); + recurse_over_translators (context (), &Translator::finalize, UP); } /* @@ -98,23 +98,29 @@ Score_engraver::finish () void Score_engraver::initialize () { - Font_metric *fm = all_fonts_global->find_afm("feta20"); + Font_metric *fm = all_fonts_global->find_afm ("feta20"); if (!fm) error (_f ("can't find `%s'", "feta20.afm") - + "\n" +_ ("Fonts have not been installed properly. Aborting")); + + "\n" +_ ("Music font has not been installed properly. Aborting")); + + SCM pfa_path = ly_kpathsea_expand_path (scm_makfrom0str ("ecrm10.pfa")); + if (!ly_c_string_p (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/")); pscore_ = new Paper_score; - pscore_->paper_ = dynamic_cast (get_output_def ()); + pscore_->paper_ = dynamic_cast (get_output_def ()); - SCM props = updated_grob_properties (daddy_context_, ly_symbol2scm ("System")); + SCM props = updated_grob_properties (context (), ly_symbol2scm ("System")); pscore_->typeset_line (new System (props)); make_columns (); system_ = pscore_->system_; system_->set_bound (LEFT, command_column_); - command_column_->set_grob_property ("breakable", SCM_BOOL_T); + command_column_->set_property ("breakable", SCM_BOOL_T); Engraver_group_engraver::initialize (); } @@ -128,7 +134,7 @@ Score_engraver::finalize () Grob * cc = unsmob_grob (get_property ("currentCommandColumn")); system_->set_bound (RIGHT, cc); - cc->set_grob_property ("breakable", SCM_BOOL_T); + cc->set_property ("breakable", SCM_BOOL_T); typeset_all (); } @@ -139,11 +145,11 @@ Score_engraver::one_time_step () { if (!to_boolean (get_property ("skipTypesetting"))) { - recurse_down_engravers (daddy_context_, &Engraver::process_music, false); - recurse_down_engravers (daddy_context_, &Engraver::do_announces, true); + recurse_over_translators (context (), &Engraver::process_music, UP); + Engraver_group_engraver::do_announces(); } - recurse_down_translators (daddy_context_, &Translator::stop_translation_timestep, true); + recurse_over_translators (context (), &Translator::stop_translation_timestep, UP); } void @@ -151,16 +157,9 @@ Score_engraver::announce_grob (Grob_info info) { announce_infos_.push (info); pscore_->system_->typeset_grob (info.grob_); + elems_.push (info.grob_); } -void -Score_engraver::typeset_grob (Grob *elem) -{ - if (!elem) - programming_error ("Score_engraver: empty elt\n"); - else - elems_.push (elem); -} void Score_engraver::typeset_all () @@ -168,37 +167,16 @@ Score_engraver::typeset_all () for (int i =0; i < elems_.size (); i++) { Grob * elem = elems_[i]; + - if (Spanner *s = dynamic_cast (elem)) - { - /* - do something sensible if spanner not - spanned on 2 items. - */ - Direction d = LEFT; - do { - if (!s->get_bound (d)) - { - s->set_bound (d, command_column_); - /* don't warn for empty/suicided spanners, - it makes real warningsinvisible. - maybe should be junked earlier? */ - if (!elem->live()) - ; // gdb hook - else - elem->warning (_f ("unbound spanner `%s'", s->name ().to_str0 ())); - } - } - while (flip (&d) != LEFT); - - if (dynamic_cast (s->get_parent (Y_AXIS))) - programming_error ("Spanner Y-parent is an item."); - } - else + if (dynamic_cast (elem)) { - if (!elem->get_parent (X_AXIS)) + if (!elem->get_parent (X_AXIS) + && elem != command_column_ + && elem != musical_column_ + ) { - bool br = to_boolean (elem->get_grob_property ("breakable")); + bool br = to_boolean (elem->get_property ("breakable")); Axis_group_interface::add_element (br ? command_column_ : musical_column_, elem); } @@ -216,7 +194,7 @@ Score_engraver::stop_translation_timestep () Engraver_group_engraver::stop_translation_timestep (); typeset_all (); - if (to_boolean (command_column_->get_grob_property ("breakable"))) + if (to_boolean (command_column_->get_property ("breakable"))) { breaks_ ++; if (! (breaks_%8)) @@ -241,56 +219,61 @@ Score_engraver::set_columns (Paper_column *new_command, musical_column_ = new_musical; if (new_command) { - daddy_context_->set_property ("currentCommandColumn", new_command->self_scm ()); + context ()->set_property ("currentCommandColumn", new_command->self_scm ()); } if (new_musical) { - daddy_context_->set_property ("currentMusicalColumn", new_musical->self_scm ()); + context ()->set_property ("currentMusicalColumn", new_musical->self_scm ()); } } Music_output* Score_engraver::get_output () { - Music_output * o = pscore_; - pscore_=0; + Music_output *o = pscore_; + ///FIXME WTF? pscore_ = 0; return o; } - bool -Score_engraver::try_music (Music*r) +Score_engraver::try_music (Music *m) { - bool gotcha = Engraver_group_engraver::try_music (r); + if (Engraver_group_engraver::try_music (m)) + return true; - if (!gotcha && r->is_mus_type ("break-event")) + if (m->is_mus_type ("break-event")) { - gotcha = true; - - SCM pen = command_column_->get_grob_property ("penalty"); - Real total_penalty = gh_number_p (pen) - ? gh_scm2double (pen) - : 0.0; - - SCM rpen = r->get_mus_property ("penalty"); - if (gh_number_p (rpen)) - total_penalty += gh_scm2double (rpen); - - if (total_penalty > 10000.0) // ugh. arbitrary. + SCM pen = command_column_->get_property ("penalty"); + Real total_penalty = ly_c_number_p (pen) ? ly_scm2double (pen) : 0.0; + + SCM mpen = m->get_property ("penalty"); + if (ly_c_number_p (mpen)) + total_penalty += ly_scm2double (mpen); + + command_column_->set_property ("penalty", scm_make_real (total_penalty)); + + /* ugh. arbitrary, hardcoded */ + if (total_penalty > 10000.0) forbid_breaks (); - command_column_->set_grob_property ("penalty", - gh_double2scm (total_penalty)); + SCM page_pen = command_column_->get_property ("page-penalty"); + Real total_pp = ly_c_number_p (page_pen) ? ly_scm2double (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); + + command_column_->set_property ("page-penalty", scm_make_real (total_pp)); + return true; } - return gotcha; + return false; } void Score_engraver::forbid_breaks () { if (command_column_) - command_column_->set_grob_property ("breakable", SCM_EOL); + command_column_->set_property ("breakable", SCM_EOL); } void @@ -312,7 +295,7 @@ Score_engraver::acknowledge_grob (Grob_info gi) -ENTER_DESCRIPTION(Score_engraver, +ENTER_DESCRIPTION (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 "