]> git.donarmstrong.com Git - lilypond.git/blob - lily/ties-engraver.cc
9ed1ef3b04d5255ede50fd6da0222ced5c2dd7fb
[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       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));
113       
114       end_tie_p_arr_[i]->dir_ = dir;
115       typeset_element (end_tie_p_arr_[i]);
116     }
117
118   end_tie_p_arr_ = tie_p_arr_;
119   left_head_mel_tuple_arr_ = head_mel_tuple_arr_;
120   end_req_l_ = req_l_;
121   
122   req_l_ =0;
123   head_mel_tuple_arr_.clear ();
124   tie_p_arr_.clear ();
125 }
126
127 void
128 Ties_engraver::do_removal_processing ()
129 {
130 }
131
132 void
133 Ties_engraver::do_process_requests ()
134 {}
135
136
137 IMPLEMENT_IS_TYPE_B1(Ties_engraver,Engraver);
138 ADD_THIS_TRANSLATOR(Ties_engraver);
139
140
141 Head_melodic_tuple::Head_melodic_tuple ()
142 {
143   head_l_ =0;
144   mel_l_ =0;
145 }
146
147 Head_melodic_tuple::Head_melodic_tuple (Note_head *h, Melodic_req*m)
148 {
149   head_l_ = h;
150   mel_l_ = m;
151 }
152
153 int
154 Head_melodic_tuple::compare (Head_melodic_tuple const&h1,
155                              Head_melodic_tuple const &h2)
156 {
157   return Melodic_req::compare (*h1.mel_l_, *h2.mel_l_);
158 }