X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fscript-engraver.cc;h=542f59fcc9e3d37875386275c5815258af83134c;hb=c3214d7d27899529e67f9e57850167775eaf675d;hp=3defd89c8d298c77dbc051320748097393f329d2;hpb=6f5b694886301a2facf7293d9f70cf41232103a6;p=lilypond.git diff --git a/lily/script-engraver.cc b/lily/script-engraver.cc index 3defd89c8d..542f59fcc9 100644 --- a/lily/script-engraver.cc +++ b/lily/script-engraver.cc @@ -1,7 +1,7 @@ /* script-engraver.cc -- implement Script_engraver - (c) 1997--2003 Han-Wen Nienhuys + (c) 1997--2004 Han-Wen Nienhuys */ #include "script.hh" @@ -11,7 +11,9 @@ #include "rhythmic-head.hh" #include "engraver.hh" #include "note-column.hh" -#include "translator-group.hh" +#include "context.hh" + +#include "warn.hh" struct Script_tuple { @@ -30,30 +32,33 @@ class Script_engraver : public Engraver { Array scripts_; public: - TRANSLATOR_DECLARATIONS(Script_engraver); + TRANSLATOR_DECLARATIONS (Script_engraver); protected: virtual bool try_music (Music*); - virtual void initialize (); virtual void stop_translation_timestep (); - virtual void start_translation_timestep (); virtual void process_music (); virtual void acknowledge_grob (Grob_info); }; -void -Script_engraver::initialize () -{ - scripts_.clear (); -} - bool Script_engraver::try_music (Music *r) { if (r->is_mus_type ("articulation-event")) { + /* + Discard double articulations. + This is necessary for part-combining. + */ + for (int j = 0; j < scripts_.size (); j++) + if (gh_equal_p (scripts_[j]. event_->get_property ("articulation-type"), + r->get_property ("articulation-type") + )) + return true; + Script_tuple t; t.event_ =r; scripts_.push (t); + return true; } return false; @@ -62,12 +67,12 @@ Script_engraver::try_music (Music *r) void copy_property (Grob * g , SCM sym, SCM alist) { - if (g->internal_get_grob_property (sym) == SCM_EOL) + if (g->internal_get_property (sym) == SCM_EOL) { SCM entry = scm_assoc (sym,alist); if (gh_pair_p (entry)) { - g->internal_set_grob_property (sym, gh_cdr (entry)); + g->internal_set_property (sym, gh_cdr (entry)); } } } @@ -78,31 +83,28 @@ copy_property (Grob * g , SCM sym, SCM alist) little space by tacking the props onto the Script grob (i.e. make ScriptStaccato , ScriptMarcato, etc. ) */ -Grob *make_script_from_event (SCM * descr, Translator_group*tg, Music * event, - int index) +void make_script_from_event (Grob *p, + SCM * descr, Context *tg, + SCM art_type, + int index) { SCM alist = tg->get_property ("scriptDefinitions"); - SCM art_type= event->get_mus_property ("articulation-type"); SCM art = scm_assoc (art_type, alist); if (art == SCM_BOOL_F) { - event->origin ()->warning (_("Don't know how to interpret articulation:")); - event->origin ()->warning (_("Scheme encoding: ")); + warning (_("Don't know how to interpret articulation:")); + warning (_("Scheme encoding: ")); scm_write (art_type, scm_current_error_port ()); - return 0 ; + return ; } art = gh_cdr (art); - - Grob *p =new Item (tg->get_property ("Script")); + *descr = art; - SCM force_dir = event->get_mus_property ("direction"); - if (is_direction (force_dir) && to_dir (force_dir)) - p->set_grob_property ("direction", force_dir); - copy_property (p, ly_symbol2scm ("script-molecule"), 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); @@ -120,8 +122,7 @@ Grob *make_script_from_event (SCM * descr, Translator_group*tg, Music * event, prio += index; Side_position_interface::set_axis (p, Y_AXIS); - p->set_grob_property ("script-priority", gh_int2scm (prio)); - return p; + p->set_property ("script-priority", gh_int2scm (prio)); } void @@ -131,11 +132,21 @@ Script_engraver::process_music () { Music* l=scripts_[i].event_; - Grob * p = make_script_from_event (&scripts_[i].description_, daddy_trans_, l, i); + Grob * p = make_item ("Script"); + + make_script_from_event (p, &scripts_[i].description_, daddy_context_, + l->get_property ("articulation-type"), + i); scripts_[i].script_ = p; + + + SCM force_dir = l->get_property ("direction"); + if (is_direction (force_dir) && to_dir (force_dir)) + p->set_property ("direction", force_dir); + if (p) - announce_grob (p, l->self_scm()); + announce_grob (p, l->self_scm ()); } } @@ -148,8 +159,8 @@ Script_engraver::acknowledge_grob (Grob_info inf) { Grob*e = scripts_[i].script_; - if (to_dir (e->get_grob_property ("side-relative-direction"))) - e->set_grob_property ("direction-source", inf.grob_->self_scm ()); + if (to_dir (e->get_property ("side-relative-direction"))) + e->set_property ("direction-source", inf.grob_->self_scm ()); /* add dep ? @@ -209,25 +220,20 @@ Script_engraver::stop_translation_timestep () SCM follow = scm_assoc (ly_symbol2scm ("follow-into-staff"), scripts_[i].description_); if (gh_pair_p (follow) && to_boolean (gh_cdr (follow))) - sc->add_offset_callback (Side_position_interface::quantised_position_proc, Y_AXIS); - else - Side_position_interface::add_staff_support (sc); + { + sc->add_offset_callback (Side_position_interface::quantised_position_proc, Y_AXIS); + sc->set_property ("staff-padding", SCM_EOL); + } typeset_grob (sc); } scripts_.clear (); } -void -Script_engraver::start_translation_timestep () -{ - scripts_.clear (); -} - -Script_engraver::Script_engraver(){} +Script_engraver::Script_engraver (){} -ENTER_DESCRIPTION(Script_engraver, +ENTER_DESCRIPTION (Script_engraver, /* descr */ "Handles note scripted articulations.", /* creats*/ "Script", /* accepts */ "script-event articulation-event",