2 tie-reg.cc -- implement Ties_engraver
4 source file of the GNU LilyPond music typesetter
6 (c) 1997--1998 Han-Wen Nienhuys <hanwen@cs.uu.nl>
9 #include "ties-engraver.hh"
11 #include "note-head.hh"
12 #include "musical-request.hh"
13 #include "music-list.hh"
15 Ties_engraver::Ties_engraver()
17 req_l_ = end_req_l_ =0;
18 processed_ack_pass_i_ = 0;
23 Ties_engraver::do_post_move_processing()
25 processed_ack_pass_i_ =0;
29 Ties_engraver::do_try_request (Request*req)
31 if (! req->access_Musical_req ())
34 Tie_req * r= req->access_Musical_req ()->access_Tie_req ();
44 Ties_engraver::acknowledge_element (Score_element_info i)
46 if (!req_l_ && ! end_req_l_)
48 if (i.elem_l_->is_type_b (Note_head::static_name ()))
50 Note_head * h = (Note_head*)i.elem_l_->access_Item ();
51 Melodic_req *m = i.req_l_->access_Musical_req ()->access_Melodic_req ();
53 head_mel_tuple_arr_.push (Head_melodic_tuple (h, m));
58 Ties_engraver::process_acknowledged ()
60 if (!head_mel_tuple_arr_.size () || processed_ack_pass_i_ ++)
63 head_mel_tuple_arr_.sort (Head_melodic_tuple::compare);
64 if (req_l_ && !tie_p_arr_.size ())
66 for (int i=0; i < head_mel_tuple_arr_.size (); i++)
69 p->set_head (LEFT,head_mel_tuple_arr_[i].head_l_);
70 // announce_element (Score_element_info (p, req_l_));
77 for (int i=0; i < end_tie_p_arr_.size (); i++)
80 if (j >= head_mel_tuple_arr_.size ())
82 left_head_mel_tuple_arr_[i].mel_l_->warning (_( "Can't find a note head at the right to attach Tie"));
83 j = head_mel_tuple_arr_.size () -1;
86 Tie*p=end_tie_p_arr_[i];
87 p->set_head (RIGHT, head_mel_tuple_arr_[j].head_l_);
88 if (!Melodic_req::compare (*head_mel_tuple_arr_[j].mel_l_,
89 *left_head_mel_tuple_arr_[j].mel_l_))
90 p->same_pitch_b_ = true;
91 announce_element ( Score_element_info (p, end_req_l_));
98 Ties_engraver::do_pre_move_processing()
100 if (!head_mel_tuple_arr_.size ())
104 for (int i =0; i < end_tie_p_arr_.size (); i++)
106 Scalar tie_dir (get_property ("tieYDirection"));
107 Scalar y_dir (get_property ("ydirection"));
108 Direction dir = CENTER;
109 if (tie_dir.length_i () && tie_dir.isnum_b ())
110 dir = (Direction) sign (int (tie_dir));
111 else if (y_dir.length_i () && y_dir.isnum_b ())
112 dir = (Direction) sign (int (y_dir));
114 end_tie_p_arr_[i]->dir_ = dir;
115 typeset_element (end_tie_p_arr_[i]);
118 end_tie_p_arr_ = tie_p_arr_;
119 left_head_mel_tuple_arr_ = head_mel_tuple_arr_;
123 head_mel_tuple_arr_.clear ();
128 Ties_engraver::do_removal_processing ()
133 Ties_engraver::do_process_requests ()
137 IMPLEMENT_IS_TYPE_B1(Ties_engraver,Engraver);
138 ADD_THIS_TRANSLATOR(Ties_engraver);
141 Head_melodic_tuple::Head_melodic_tuple ()
147 Head_melodic_tuple::Head_melodic_tuple (Note_head *h, Melodic_req*m)
154 Head_melodic_tuple::compare (Head_melodic_tuple const&h1,
155 Head_melodic_tuple const &h2)
157 return Melodic_req::compare (*h1.mel_l_, *h2.mel_l_);