X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fnew-fingering-engraver.cc;h=496e19f93d89e103b15b89a2197a7f0af16ed20e;hb=6ba180c8956f07784b64f1a0d96c2a7b93b8c221;hp=dc55d8e7f3d51464774914918317f88ba365465c;hpb=108cf0e8c08c8e15e2a800feb161cfad9057daa8;p=lilypond.git diff --git a/lily/new-fingering-engraver.cc b/lily/new-fingering-engraver.cc index dc55d8e7f3..496e19f93d 100644 --- a/lily/new-fingering-engraver.cc +++ b/lily/new-fingering-engraver.cc @@ -3,17 +3,19 @@ source file of the GNU LilyPond music typesetter - (c) 1998--2005 Han-Wen Nienhuys + (c) 1998--2006 Han-Wen Nienhuys */ -#include "warn.hh" #include "engraver.hh" -#include "side-position-interface.hh" -#include "stem.hh" + +#include "international.hh" #include "rhythmic-head.hh" -#include "self-alignment-interface.hh" #include "script-interface.hh" +#include "self-alignment-interface.hh" +#include "side-position-interface.hh" #include "stem.hh" +#include "stem.hh" +#include "warn.hh" #include "translator.icc" @@ -41,11 +43,11 @@ struct Finger_tuple class New_fingering_engraver : public Engraver { - Array fingerings_; - Array articulations_; - Array string_numbers_; + std::vector fingerings_; + std::vector articulations_; + std::vector string_numbers_; - Link_array heads_; + Link_array__Grob_ heads_; Grob *stem_; public: @@ -57,7 +59,7 @@ protected: void add_fingering (Grob *, Music *, Music *); void add_script (Grob *, Music *, Music *); void add_string (Grob *, Music *, Music *); - void position_scripts (SCM orientations, Array *); + void position_scripts (SCM orientations, std::vector *); }; void @@ -93,7 +95,7 @@ New_fingering_engraver::acknowledge_rhythmic_head (Grob_info inf) } } - heads_.push (inf.grob ()); + heads_.push_back (inf.grob ()); } void @@ -112,13 +114,12 @@ New_fingering_engraver::add_script (Grob *head, Finger_tuple ft; Grob *g = make_item ("Script", event->self_scm ()); - make_script_from_event (g, &ft.follow_into_staff_, context (), - event->get_property ("articulation-type"), 0); + make_script_from_event (g, context (), event->get_property ("articulation-type"), 0); if (g) { ft.script_ = g; - articulations_.push (ft); + articulations_.push_back (ft); ft.script_->set_parent (head, X_AXIS); } @@ -158,7 +159,7 @@ New_fingering_engraver::add_fingering (Grob *head, ft.note_event_ = hevent; ft.head_ = head; - fingerings_.push (ft); + fingerings_.push_back (ft); } void @@ -181,16 +182,16 @@ New_fingering_engraver::add_string (Grob *head, ft.note_event_ = hevent; ft.head_ = head; - string_numbers_.push (ft); + string_numbers_.push_back (ft); } void New_fingering_engraver::position_scripts (SCM orientations, - Array *scripts) + std::vector *scripts) { - for (int i = 0; i < scripts->size (); i++) - if (stem_ && to_boolean (scripts->elem (i).script_->get_property ("add-stem-support"))) - Side_position_interface::add_support (scripts->elem (i).script_, stem_); + for (vsize i = 0; i < scripts->size (); i++) + if (stem_ && to_boolean (scripts->at (i).script_->get_property ("add-stem-support"))) + Side_position_interface::add_support (scripts->at (i).script_, stem_); /* This is not extremely elegant, but we have to do a little @@ -201,25 +202,25 @@ New_fingering_engraver::position_scripts (SCM orientations, to the note head, and write a more flexible function for positioning the fingerings, setting both X and Y coordinates. */ - for (int i = 0; i < scripts->size (); i++) + for (vsize i = 0; i < scripts->size (); i++) (*scripts)[i].position_ = scm_to_int ((*scripts)[i].head_->get_property ("staff-position")); - for (int i = scripts->size (); i--;) - for (int j = heads_.size (); j--;) + for (vsize i = scripts->size (); i--;) + for (vsize j = heads_.size (); j--;) Side_position_interface::add_support ((*scripts)[i].script_, heads_[j]); - Array up, down, horiz; - for (int i = scripts->size (); i--;) + std::vector up, down, horiz; + for (vsize i = scripts->size (); i--;) { SCM d = (*scripts)[i].finger_event_->get_property ("direction"); if (to_dir (d)) { - ((to_dir (d) == UP) ? up : down).push ((*scripts)[i]); - scripts->del (i); + ((to_dir (d) == UP) ? up : down).push_back ((*scripts)[i]); + scripts->erase (scripts->begin () + i); } } - scripts->sort (&Finger_tuple::compare); + vector_sort (*scripts, Finger_tuple::compare); bool up_p = scm_c_memq (ly_symbol2scm ("up"), orientations) != SCM_BOOL_F; bool down_p = scm_c_memq (ly_symbol2scm ("down"), orientations) != SCM_BOOL_F; @@ -229,25 +230,28 @@ New_fingering_engraver::position_scripts (SCM orientations, if (left_p || right_p) { if (up_p && !up.size () && scripts->size ()) - up.push (scripts->pop ()); + { + up.push_back (scripts->back ()); + scripts->pop_back (); + } if (down_p && !down.size () && scripts->size ()) { - down.push ((*scripts)[0]); - scripts->del (0); + down.push_back ((*scripts)[0]); + scripts->erase (scripts->begin ()); } - horiz.concat (*scripts); + horiz.insert (horiz.end (), scripts->begin (), scripts->end ()); } else if (up_p && down_p) { int center = scripts->size () / 2; - down.concat (scripts->slice (0, center)); - up.concat (scripts->slice (center, scripts->size ())); + down.insert (down.end (), scripts->begin (), scripts->begin () + center); + up.insert (up.end (), scripts->begin () + center, scripts->end ()); } else if (up_p) { - up.concat (*scripts); + up.insert (up.end (), scripts->begin (), scripts->end ()); scripts->clear (); } else @@ -257,51 +261,46 @@ New_fingering_engraver::position_scripts (SCM orientations, warning (_ ("no placement found for fingerings")); warning (_ ("placing below")); } - down.concat (*scripts); + down.insert (down.end (), scripts->begin (), scripts->end ()); scripts->clear (); } - for (int i = 0; i < horiz.size (); i++) + for (vsize i = 0; i < horiz.size (); i++) { Finger_tuple ft = horiz[i]; Grob *f = ft.script_; f->set_parent (ft.head_, X_AXIS); f->set_parent (ft.head_, Y_AXIS); - f->add_offset_callback (Self_alignment_interface::centered_on_parent_proc, Y_AXIS); - f->add_offset_callback (Self_alignment_interface::aligned_on_self_proc, Y_AXIS); - f->add_offset_callback (Side_position_interface::aligned_side_proc, X_AXIS); + + Self_alignment_interface::set_align_self (f, Y_AXIS); + Self_alignment_interface::set_center_parent (f, Y_AXIS); + Side_position_interface::set_axis (f, X_AXIS); f->set_property ("direction", scm_from_int (hordir)); } int finger_prio = 200; - for (int i = 0; i < up.size (); i++) - { - Finger_tuple ft = up[i]; - Grob *f = ft.script_; - f->set_parent (ft.head_, X_AXIS); - f->set_property ("script-priority", - scm_from_int (finger_prio + ft.position_)); - f->add_offset_callback (Side_position_interface::aligned_side_proc, Y_AXIS); - f->add_offset_callback (Self_alignment_interface::centered_on_parent_proc, X_AXIS); - f->add_offset_callback (Self_alignment_interface::aligned_on_self_proc, X_AXIS); - - f->set_property ("direction", scm_from_int (UP)); - } - for (int i = 0; i < down.size (); i++) + Direction d = DOWN; + Drul_array< std::vector > vertical (down, up); + do { - Finger_tuple ft = down[i]; - Grob *f = ft.script_; - f->set_parent (ft.head_, X_AXIS); - f->set_property ("script-priority", - scm_from_int (finger_prio + down.size () - ft.position_)); - - f->add_offset_callback (Self_alignment_interface::centered_on_parent_proc, X_AXIS); - f->add_offset_callback (Self_alignment_interface::aligned_on_self_proc, X_AXIS); - f->add_offset_callback (Side_position_interface::aligned_side_proc, Y_AXIS); - f->set_property ("direction", scm_from_int (DOWN)); + for (vsize i = 0; i < vertical[d].size (); i++) + { + Finger_tuple ft = vertical[d][i]; + Grob *f = ft.script_; + f->set_parent (ft.head_, X_AXIS); + f->set_property ("script-priority", + scm_from_int (finger_prio + d * ft.position_)); + + Self_alignment_interface::set_align_self (f, X_AXIS); + Self_alignment_interface::set_center_parent (f, X_AXIS); + Side_position_interface::set_axis (f, Y_AXIS); + + f->set_property ("direction", scm_from_int (d)); + } } + while (flip (&d) != DOWN); } void @@ -321,11 +320,11 @@ New_fingering_engraver::stop_translation_timestep () string_numbers_.clear (); } - for (int i = articulations_.size (); i--;) + for (vsize i = articulations_.size (); i--;) { Grob *script = articulations_[i].script_; - for (int j = heads_.size (); j--;) + for (vsize j = heads_.size (); j--;) Side_position_interface::add_support (script, heads_[j]); if (stem_ && to_dir (script->get_property ("side-relative-direction"))) @@ -334,11 +333,7 @@ New_fingering_engraver::stop_translation_timestep () if (stem_ && to_boolean (script->get_property ("add-stem-support"))) Side_position_interface::add_support (script, stem_); - if (articulations_[i].follow_into_staff_) - { - script->add_offset_callback (Side_position_interface::quantised_position_proc, Y_AXIS); - script->set_property ("staff-padding", SCM_EOL); - } + } stem_ = 0;