]> git.donarmstrong.com Git - lilypond.git/blob - lily/ties-engraver.cc
release: 1.1.1
[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 (Tie_req * r = dynamic_cast <Tie_req *> (req))
32     {  
33       req_l_ = r;
34       return true;
35     }
36   return false;
37 }
38
39
40 void
41 Ties_engraver::acknowledge_element (Score_element_info i)
42 {
43   if (!req_l_ && ! end_req_l_)
44     return;
45   if (Note_head * h = dynamic_cast <Note_head *> (i.elem_l_))
46     {
47       Melodic_req *m = dynamic_cast <Melodic_req *> (i.req_l_);
48       
49       head_mel_tuple_arr_.push (Head_melodic_tuple (h, m));
50     }
51 }
52
53 void
54 Ties_engraver::process_acknowledged ()
55 {
56   if (!head_mel_tuple_arr_.size () || processed_ack_pass_i_ ++)
57     return;
58
59   head_mel_tuple_arr_.sort (Head_melodic_tuple::compare);
60   if (req_l_ && !tie_p_arr_.size ())
61     {
62       for (int i=0; i < head_mel_tuple_arr_.size (); i++)
63         {
64           Tie*  p = new Tie;
65           p->set_head (LEFT,head_mel_tuple_arr_[i].head_l_);
66           //      announce_element (Score_element_info (p, req_l_));
67           tie_p_arr_.push (p);
68         }
69     }
70
71   if (end_req_l_)
72     {
73       for (int i=0; i < end_tie_p_arr_.size (); i++)
74         {
75           int j = i;
76           if (j >= head_mel_tuple_arr_.size ())
77             {
78               left_head_mel_tuple_arr_[i].mel_l_->warning (_( "Can't find a note head at the right to attach Tie"));
79               j = head_mel_tuple_arr_.size () -1;
80             }
81           
82           Tie*p=end_tie_p_arr_[i];
83           p->set_head (RIGHT, head_mel_tuple_arr_[j].head_l_);
84           if (!Melodic_req::compare (*head_mel_tuple_arr_[j].mel_l_,
85                                      *left_head_mel_tuple_arr_[j].mel_l_))
86             p->same_pitch_b_ = true;
87           announce_element ( Score_element_info (p, end_req_l_));
88         }
89     }
90 }
91
92
93 void
94 Ties_engraver::do_pre_move_processing()
95 {
96   if (!head_mel_tuple_arr_.size ())
97     return;
98
99
100   for (int i =0; i < end_tie_p_arr_.size (); i++)
101     {
102       Scalar tie_dir (get_property ("tieYDirection"));
103       Scalar y_dir (get_property ("ydirection"));      
104       Direction dir = CENTER;
105       if (tie_dir.length_i () && tie_dir.isnum_b ())
106         dir = (Direction) sign (int (tie_dir));
107       else if (y_dir.length_i () && y_dir.isnum_b ())
108         dir = (Direction) sign (int (y_dir));
109       
110       end_tie_p_arr_[i]->dir_ = dir;
111       typeset_element (end_tie_p_arr_[i]);
112     }
113
114   end_tie_p_arr_ = tie_p_arr_;
115   left_head_mel_tuple_arr_ = head_mel_tuple_arr_;
116   end_req_l_ = req_l_;
117   
118   req_l_ =0;
119   head_mel_tuple_arr_.clear ();
120   tie_p_arr_.clear ();
121 }
122
123 void
124 Ties_engraver::do_removal_processing ()
125 {
126 }
127
128 void
129 Ties_engraver::do_process_requests ()
130 {}
131
132
133 IMPLEMENT_IS_TYPE_B1(Ties_engraver,Engraver);
134 ADD_THIS_TRANSLATOR(Ties_engraver);
135
136
137 Head_melodic_tuple::Head_melodic_tuple ()
138 {
139   head_l_ =0;
140   mel_l_ =0;
141 }
142
143 Head_melodic_tuple::Head_melodic_tuple (Note_head *h, Melodic_req*m)
144 {
145   head_l_ = h;
146   mel_l_ = m;
147 }
148
149 int
150 Head_melodic_tuple::compare (Head_melodic_tuple const&h1,
151                              Head_melodic_tuple const &h2)
152 {
153   return Melodic_req::compare (*h1.mel_l_, *h2.mel_l_);
154 }