X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Ffingering-engraver.cc;h=a8c4fcf68085bedfe8c5f78bd7e2306cc6345d8b;hb=7e0dab27123da5d52b90c81f70ac10669a34d45a;hp=bcfb63a711e9d8dc2cf2cffc25f1644599310142;hpb=58bcc84c9480dae1b21bc24d8396b91fe19e0131;p=lilypond.git diff --git a/lily/fingering-engraver.cc b/lily/fingering-engraver.cc index bcfb63a711..a8c4fcf680 100644 --- a/lily/fingering-engraver.cc +++ b/lily/fingering-engraver.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1998--2005 Han-Wen Nienhuys + (c) 1998--2006 Han-Wen Nienhuys */ #include "engraver.hh" @@ -11,20 +11,21 @@ #include "stem.hh" #include "rhythmic-head.hh" #include "self-alignment-interface.hh" +#include "pitch.hh" class Fingering_engraver : public Engraver { - Link_array reqs_; - Link_array fingerings_; + vector events_; + vector fingerings_; public: TRANSLATOR_DECLARATIONS (Fingering_engraver); protected: virtual bool try_music (Music *m); - virtual void stop_translation_timestep (); - virtual void start_translation_timestep (); - virtual void process_music (); - virtual void acknowledge_grob (Grob_info); + void stop_translation_timestep (); + void process_music (); + DECLARE_ACKNOWLEDGER (rhythmic_head); + DECLARE_ACKNOWLEDGER (stem); private: void make_script (Direction, Music *, int); @@ -35,41 +36,38 @@ Fingering_engraver::try_music (Music *m) { if (m->is_mus_type ("fingering-event")) { - reqs_.push (m); + events_.push_back (m); return true; } return false; } void -Fingering_engraver::acknowledge_grob (Grob_info inf) +Fingering_engraver::acknowledge_stem (Grob_info inf) { - if (Stem::has_interface (inf.grob_)) - { - for (int i = 0; i < fingerings_.size (); i++) - { - Side_position_interface::add_support (fingerings_[i], inf.grob_); - } - } - else if (Rhythmic_head::has_interface (inf.grob_)) + for (vsize i = 0; i < fingerings_.size (); i++) + Side_position_interface::add_support (fingerings_[i], inf.grob ()); +} + +void +Fingering_engraver::acknowledge_rhythmic_head (Grob_info inf) +{ + for (vsize i = 0; i < fingerings_.size (); i++) { - for (int i = 0; i < fingerings_.size (); i++) - { - Grob *t = fingerings_[i]; - Side_position_interface::add_support (t, inf.grob_); - if (!t->get_parent (X_AXIS)) - t->set_parent (inf.grob_, X_AXIS); - } + Grob *t = fingerings_[i]; + Side_position_interface::add_support (t, inf.grob ()); + if (!t->get_parent (X_AXIS)) + t->set_parent (inf.grob (), X_AXIS); } } void Fingering_engraver::process_music () { - for (int i = reqs_.size (); i--;) + for (vsize i = events_.size (); i--;) { - SCM dir = reqs_[i]->get_property ("direction"); - make_script (to_dir (dir), reqs_[i], i); + SCM dir = events_[i]->get_property ("direction"); + make_script (to_dir (dir), events_[i], i); } } @@ -77,8 +75,6 @@ void Fingering_engraver::make_script (Direction d, Music *r, int i) { Item *fingering = make_item ("Fingering", r->self_scm ()); - Axis a = Y_AXIS; - Axis other = other_axis (a); /* Huh, what's this for? --hwn. @@ -93,9 +89,9 @@ Fingering_engraver::make_script (Direction d, Music *r, int i) We can't fold these definitions into define-grobs since fingerings for chords need different settings. */ - Side_position_interface::set_axis (fingering, a); - fingering->add_offset_callback (Self_alignment_interface::aligned_on_self_proc, other); - fingering->add_offset_callback (Self_alignment_interface::centered_on_parent_proc, other); + Side_position_interface::set_axis (fingering, Y_AXIS); + Self_alignment_interface::set_align_self (fingering, X_AXIS); + Self_alignment_interface::set_center_parent (fingering, X_AXIS); // Hmm int priority = 200; @@ -106,20 +102,20 @@ Fingering_engraver::make_script (Direction d, Music *r, int i) /* See script-engraver.cc */ priority += i; - fingering->set_property ("script-priority", scm_int2num (priority)); + fingering->set_property ("script-priority", scm_from_int (priority)); - if (!is_direction (fingering->get_property ("direction"))) + if (!is_direction (fingering->get_property_data (ly_symbol2scm ("direction")))) { if (d) - fingering->set_property ("direction", scm_int2num (d)); + fingering->set_property ("direction", scm_from_int (d)); else - fingering->set_property ("direction", scm_int2num (RIGHT)); + fingering->set_property ("direction", scm_from_int (RIGHT)); } SCM dig = r->get_property ("digit"); - fingering->set_property ("text", scm_number_to_string (dig, scm_int2num (10))); + fingering->set_property ("text", scm_number_to_string (dig, scm_from_int (10))); - fingerings_.push (fingering); + fingerings_.push_back (fingering); } void @@ -129,23 +125,20 @@ Fingering_engraver::stop_translation_timestep () return; fingerings_.clear (); -} - -void -Fingering_engraver::start_translation_timestep () -{ - reqs_.clear (); + events_.clear (); } Fingering_engraver::Fingering_engraver () { - } +#include "translator.icc" + +ADD_ACKNOWLEDGER (Fingering_engraver, rhythmic_head); +ADD_ACKNOWLEDGER (Fingering_engraver, stem); ADD_TRANSLATOR (Fingering_engraver, - /* descr */ "Create fingering-scripts", - /* creats*/ "Fingering", - /* accepts */ "fingering-event", - /* acks */ "rhythmic-head-interface stem-interface", - /* reads */ "", + /* doc */ "Create fingering-scripts", + /* create */ "Fingering", + /* accept */ "fingering-event", + /* read */ "", /* write */ "");