]> git.donarmstrong.com Git - lilypond.git/blob - lily/ties-engraver.cc
8f9aa3977717437dc89fdfcf97acdf8c71786af7
[lilypond.git] / lily / ties-engraver.cc
1 /*
2   tie-reg.cc -- implement Ties_engraver
3
4   source file of the GNU LilyPond music typesetter
5
6   (c)  1997--1998 Han-Wen Nienhuys <hanwen@cs.uu.nl>
7 */
8
9 #include "ties-engraver.hh"
10 #include "tie.hh"
11 #include "note-head.hh"
12 #include "musical-request.hh"
13 #include "music-list.hh"
14
15 Ties_engraver::Ties_engraver()
16 {
17   req_l_ = end_req_l_ =0;
18   processed_ack_pass_i_ = 0;
19   
20 }
21
22 void
23 Ties_engraver::do_post_move_processing()
24 {
25   processed_ack_pass_i_ =0;
26 }
27
28 bool
29 Ties_engraver::do_try_request (Request*req)
30 {
31   if (! req->access_Musical_req ())
32       return false;
33
34   Tie_req * r=  req->access_Musical_req ()->access_Tie_req ();
35   if (!r)
36     return false;
37   
38   req_l_ = r;
39   return true;
40 }
41
42
43 void
44 Ties_engraver::acknowledge_element (Score_element_info i)
45 {
46   if (!req_l_ && ! end_req_l_)
47     return;
48   if (i.elem_l_->is_type_b (Note_head::static_name ()))
49     {
50       Note_head * h = (Note_head*)i.elem_l_->access_Item ();
51       Melodic_req *m = i.req_l_->access_Musical_req ()->access_Melodic_req ();
52       
53       head_mel_tuple_arr_.push (Head_melodic_tuple (h, m));
54     }
55 }
56
57 void
58 Ties_engraver::process_acknowledged ()
59 {
60   if (!head_mel_tuple_arr_.size () || processed_ack_pass_i_ ++)
61     return;
62
63   head_mel_tuple_arr_.sort (Head_melodic_tuple::compare);
64   if (req_l_ && !tie_p_arr_.size ())
65     {
66       for (int i=0; i < head_mel_tuple_arr_.size (); i++)
67         {
68           Tie*  p = new Tie;
69           p->set_head (LEFT,head_mel_tuple_arr_[i].head_l_);
70           //      announce_element (Score_element_info (p, req_l_));
71           tie_p_arr_.push (p);
72         }
73     }
74
75   if (end_req_l_)
76     {
77       for (int i=0; i < end_tie_p_arr_.size (); i++)
78         {
79           int j = i;
80           if (j >= head_mel_tuple_arr_.size ())
81             {
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;
84             }
85           
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_));
92         }
93     }
94 }
95
96
97 void
98 Ties_engraver::do_pre_move_processing()
99 {
100   if (!head_mel_tuple_arr_.size ())
101     return;
102
103
104   for (int i =0; i < end_tie_p_arr_.size (); i++)
105     {
106       typeset_element (end_tie_p_arr_[i]);
107     }
108
109   end_tie_p_arr_ = tie_p_arr_;
110   left_head_mel_tuple_arr_ = head_mel_tuple_arr_;
111   end_req_l_ = req_l_;
112   
113   req_l_ =0;
114   head_mel_tuple_arr_.clear ();
115   tie_p_arr_.clear ();
116 }
117
118 void
119 Ties_engraver::do_removal_processing ()
120 {
121 }
122
123 void
124 Ties_engraver::do_process_requests ()
125 {}
126
127
128 IMPLEMENT_IS_TYPE_B1(Ties_engraver,Engraver);
129 ADD_THIS_TRANSLATOR(Ties_engraver);
130
131
132 Head_melodic_tuple::Head_melodic_tuple ()
133 {
134   head_l_ =0;
135   mel_l_ =0;
136 }
137
138 Head_melodic_tuple::Head_melodic_tuple (Note_head *h, Melodic_req*m)
139 {
140   head_l_ = h;
141   mel_l_ = m;
142 }
143
144 int
145 Head_melodic_tuple::compare (Head_melodic_tuple const&h1,
146                              Head_melodic_tuple const &h2)
147 {
148   return Melodic_req::compare (*h1.mel_l_, *h2.mel_l_);
149 }