X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fscript-engraver.cc;h=c5e8ff219035740e8d0ea2aeb3525e0edce8eda6;hb=f0996bcf2f14bd4d55de4ef83b5266fc77bbab52;hp=20ec7faae69e97a116040cc8cc15d37245910bb8;hpb=77e6cefa9c65766577402009987a30140c31dfe9;p=lilypond.git diff --git a/lily/script-engraver.cc b/lily/script-engraver.cc index 20ec7faae6..c5e8ff2190 100644 --- a/lily/script-engraver.cc +++ b/lily/script-engraver.cc @@ -9,8 +9,7 @@ #include "context.hh" #include "directional-element-interface.hh" #include "engraver.hh" -#include "event.hh" -#include "new-slur.hh" +#include "slur.hh" #include "note-column.hh" #include "paper-column.hh" #include "rhythmic-head.hh" @@ -24,12 +23,12 @@ struct Script_tuple { Music *event_; Grob *script_; - SCM description_; + bool follow_into_staff_; Script_tuple () { + follow_into_staff_ = false; event_ = 0; script_ = 0; - description_ = SCM_EOL; } }; @@ -80,15 +79,17 @@ copy_property (Grob *g, SCM sym, SCM alist) if (g->internal_get_property (sym) == SCM_EOL) { SCM entry = scm_assoc (sym, alist); - if (ly_c_pair_p (entry)) - g->internal_set_property (sym, ly_cdr (entry)); + if (scm_is_pair (entry)) + g->internal_set_property (sym, scm_cdr (entry)); } } -/* Add the properties, one by one for each Script. A little space - (memory? --jcn) could be saved by tacking the props onto the Script - grob (i.e. make ScriptStaccato , ScriptMarcato, etc. ). */ -void make_script_from_event (Grob *p, SCM *descr, Context *tg, +/* Add the properties, one by one for each Script. A little memory + could be saved by tacking the props onto the Script grob (i.e. make + ScriptStaccato , ScriptMarcato, etc. ). + +*/ +void make_script_from_event (Grob *p, bool * follow, Context *tg, SCM art_type, int index) { SCM alist = tg->get_property ("scriptDefinitions"); @@ -103,25 +104,46 @@ void make_script_from_event (Grob *p, SCM *descr, Context *tg, return; } - art = ly_cdr (art); - *descr = art; - - copy_property (p, ly_symbol2scm ("script-stencil"), art); - copy_property (p, ly_symbol2scm ("direction"), art); - copy_property (p, ly_symbol2scm ("side-relative-direction"), art); + art = scm_cdr (art); - int prio = 0; - SCM sprio = scm_assoc (ly_symbol2scm ("script-priority"), art); - if (ly_c_pair_p (sprio)) - prio = ly_scm2int (ly_cdr (sprio)); + SCM follow_scm = scm_assoc (ly_symbol2scm ("follow-into-staff"), + art); - /* Make sure they're in order of user input by adding index i. - Don't use the direction in this priority. Smaller means closer - to the head. */ - prio += index; + *follow = scm_is_pair (follow_scm) && to_boolean (scm_cdr (follow_scm)); + bool priority_found = false ; + + for (SCM s = art ; scm_is_pair (s); s = scm_cdr (s)) + { + SCM sym = scm_caar (s); + SCM type = scm_object_property (sym, ly_symbol2scm ("backend-type?")); + if (!ly_c_procedure_p (type)) + continue; + + SCM val = scm_cdar (s); + + if (sym == ly_symbol2scm ("script-priority")) + { + priority_found = true; + /* Make sure they're in order of user input by adding index i. + Don't use the direction in this priority. Smaller means closer + to the head. */ + int prio = scm_to_int (val) + index; + + + val = scm_int2num (prio); + } + if (p->internal_get_property (sym) == SCM_EOL) + p->internal_set_property (sym, val); + } + if (!priority_found) + { + p->set_property ("script-priority", + scm_int2num (index)); + } + Side_position_interface::set_axis (p, Y_AXIS); - p->set_property ("script-priority", scm_int2num (prio)); + } void @@ -134,7 +156,7 @@ Script_engraver::process_music () Grob *p = make_item ("Script", m->self_scm ()); - make_script_from_event (p, &scripts_[i].description_, context (), + make_script_from_event (p, &scripts_[i].follow_into_staff_, context (), m->get_property ("articulation-type"), i); @@ -164,7 +186,8 @@ Script_engraver::acknowledge_grob (Grob_info info) Side_position_interface::add_support (e, info.grob_); } } - else if (Rhythmic_head::has_interface (info.grob_)) + else if (Rhythmic_head::has_interface (info.grob_) + && info.music_cause ()) { for (int i = 0; i < script_count; i++) { @@ -196,7 +219,7 @@ Script_engraver::acknowledge_grob (Grob_info info) e->set_parent (info.grob_, X_AXIS); } } - else if (New_slur::has_interface (info.grob_)) + else if (Slur::has_interface (info.grob_)) slur_ = dynamic_cast (info.grob_); } @@ -205,25 +228,22 @@ Script_engraver::stop_translation_timestep () { int script_count = scripts_.size (); for (int i = 0; i < script_count; i++) - if (Grob *sc = scripts_[i].script_) + if (scripts_[i].follow_into_staff_) { - SCM follow = scm_assoc (ly_symbol2scm ("follow-into-staff"), - scripts_[i].description_); - if (ly_c_pair_p (follow) && to_boolean (ly_cdr (follow))) - { - sc->add_offset_callback (Side_position_interface - ::quantised_position_proc, Y_AXIS); - sc->set_property ("staff-padding", SCM_EOL); - } + Grob *sc = scripts_[i].script_; + sc->add_offset_callback (Side_position_interface + ::quantised_position_proc, Y_AXIS); + sc->set_property ("staff-padding", SCM_EOL); } + scripts_.clear (); } -ENTER_DESCRIPTION (Script_engraver, +ADD_TRANSLATOR (Script_engraver, /* descr */ "Handles note scripted articulations.", /* creats*/ "Script", /* accepts */ "script-event articulation-event", -/* acks */ "stem-interface rhythmic-head-interface\ - new-slur-interface note-column-interface", +/* acks */ "stem-interface rhythmic-head-interface " + "slur-interface note-column-interface", /* reads */ "scriptDefinitions", /* write */ "");