]> git.donarmstrong.com Git - lilypond.git/blob - lily/tie-reg.cc
release: 0.0.64
[lilypond.git] / lily / tie-reg.cc
1 /*
2   tie-reg.cc -- implement Tie_register
3
4   source file of the LilyPond music typesetter
5
6   (c) 1997 Han-Wen Nienhuys <hanwen@stack.nl>
7 */
8
9 #include "tie-reg.hh"
10 #include "tie.hh"
11 #include "notehead.hh"
12 #include "musical-request.hh"
13 #include "voice-element.hh"
14
15 Tie_register::Tie_register()
16 {
17     end_tie_p_ = 0;
18     tie_p_ = 0;
19     req_l_ =0;
20     end_req_l_ =0;
21     end_mom_ = -1;
22     melodic_req_l_ = 0;
23     end_melodic_req_l_ =0;
24 }
25
26 void
27 Tie_register::sync_features()
28 {
29     dir_i_ = get_feature("vdir");
30 }
31     
32
33 void
34 Tie_register::post_move_processing()
35 {
36     if (tie_p_ && get_staff_info().when() == end_mom_) {
37         end_tie_p_ = tie_p_;
38         end_req_l_ = req_l_;
39         end_melodic_req_l_ = melodic_req_l_;
40         tie_p_ =0;
41         req_l_ =0;
42         end_mom_ = -1;
43     }
44 }
45
46 bool
47 Tie_register::acceptable_request_b(Request*r)
48 {
49     return r->musical() && r->musical()->tie();
50 }
51
52 bool
53 Tie_register::try_request(Request*r)
54 {
55     if(!acceptable_request_b(r))
56         return false;
57     if (req_l_ ) {
58         return false;
59     }
60     req_l_ = r->musical()->tie();
61     end_mom_ = r->elt_l_->duration_ + get_staff_info().when();
62     return true;
63 }
64
65 void
66 Tie_register::process_requests()
67 {
68     if (req_l_ && ! tie_p_) {
69         tie_p_ = new Tie;
70     }
71 }
72
73 void
74 Tie_register::acknowledge_element(Score_elem_info i)
75 {
76     if (i.elem_l_->name() == Notehead::static_name()) {
77         if (tie_p_) {
78             tie_p_->set_head(-1, (Notehead*)i.elem_l_->item());
79             melodic_req_l_ = i.req_l_->musical()->melodic();
80         }
81
82         if (end_tie_p_) {
83             end_tie_p_->set_head(1, (Notehead*)i.elem_l_->item());
84             if (!Melodic_req::compare ( *end_melodic_req_l_, *melodic_req_l_))
85                 end_tie_p_->same_pitch_b_ = true;
86             announce_element(Score_elem_info(end_tie_p_,end_req_l_));
87         }
88     }
89 }
90
91 void
92 Tie_register::pre_move_processing()
93 {
94     if (end_tie_p_) {
95         if (dir_i_)
96             end_tie_p_->dir_i_ =  dir_i_;
97         
98         typeset_element(end_tie_p_);
99         end_tie_p_ =0;
100         end_req_l_ =0;
101     }
102  
103 }
104
105 Tie_register::~Tie_register()
106 {
107     if (tie_p_) {
108         req_l_->warning("unended Tie");
109         delete tie_p_;
110     }
111 }
112
113 void
114 Tie_register::set_feature(Feature f)
115 {
116     if (f.type_ == "vdir")
117         dir_i_ = f.value_;
118 }
119
120 IMPLEMENT_STATIC_NAME(Tie_register);
121 ADD_THIS_REGISTER(Tie_register);