]> git.donarmstrong.com Git - lilypond.git/blob - lily/stem-beam-reg.cc
release: 0.0.52
[lilypond.git] / lily / stem-beam-reg.cc
1 /*
2   stem-beam-reg.cc -- part of LilyPond
3
4   (c) 1997 Han-Wen Nienhuys <hanwen@stack.nl>
5 */
6
7 #include "musical-request.hh"
8 #include "stem-beam-reg.hh"
9 #include "beam.hh"
10 #include "stem.hh"
11 #include "grouping.hh"
12 #include "text-spanner.hh"
13 #include "complex-walker.hh"
14 #include "complex-staff.hh"
15 #include "debug.hh"
16 #include "grouping.hh"
17 #include "notehead.hh"
18
19 Stem_beam_register::Stem_beam_register()
20 {
21     post_move_processing();
22
23     current_grouping = 0;
24     beam_p_ = 0;
25     default_dir_i_ =0;
26     start_req_l_ = 0;
27 }
28
29 bool
30 Stem_beam_register::try_request(Request*req_l)
31 {
32     if ( req_l->beam() ) {
33         if (bool(beam_p_ ) == bool(req_l->beam()->spantype == Span_req::START))
34             return false;
35         
36         if (beam_req_l_ && Beam_req::compare(*beam_req_l_ , *req_l->beam()))
37             return false;
38         
39         beam_req_l_ = req_l->beam();
40         return true;
41     }
42     
43     if ( req_l->stem() ) {
44         if (current_grouping && !current_grouping->child_fit_b(
45             get_staff_info().time_C_->whole_in_measure_))
46             return false;
47
48         if (stem_req_l_ && Stem_req::compare(*stem_req_l_, *req_l->stem()))
49             return false;
50
51         stem_req_l_ = req_l->stem();
52         return true;
53     }
54     return false;
55 }
56
57 void
58 Stem_beam_register::process_requests()
59 {
60     if (beam_req_l_) {
61         if (beam_req_l_->spantype == Span_req::STOP) {
62             end_beam_b_ = true;
63             start_req_l_ = 0;
64         } else {
65             beam_p_ = new Beam;
66             start_req_l_ = beam_req_l_;
67
68             current_grouping = new Rhythmic_grouping;
69             if (beam_req_l_->nplet) {
70                 Text_spanner* t = new Text_spanner();
71                 t->set_support(beam_p_);
72                 t->spec.align_i_ = 0;
73                 t->spec.text_str_ = beam_req_l_->nplet;
74                 t->spec.style_str_="italic";
75                 typeset_element(t);
76             }
77              
78         }
79     }
80
81     if (stem_req_l_) {
82         stem_p_ = new Stem(4);
83         if (current_grouping)
84             current_grouping->add_child(
85                 get_staff_info().time_C_->whole_in_measure_,
86                 stem_req_l_->duration());
87
88         stem_p_->flag = stem_req_l_->duration_.type_i_;
89
90         if (beam_p_) {
91             if (stem_req_l_->duration_.type_i_<= 4)
92                 
93                          stem_req_l_->warning( "stem doesn't fit in Beam");
94             else
95                 beam_p_->add(stem_p_);
96             stem_p_->print_flag = false;
97         } else {
98             stem_p_->print_flag = true;
99         }
100         
101         announce_element(Staff_elem_info(stem_p_, stem_req_l_));
102     }
103 }
104
105 void
106 Stem_beam_register::acknowledge_element(Staff_elem_info info)
107 {
108     if (!stem_p_)
109         return;
110
111     if (info.elem_l_->name() == Notehead::static_name() &&
112         stem_req_l_->duration() == info.req_l_->rhythmic()->duration()){
113         Notehead * n_l= (Notehead*)info.elem_l_;
114         if (!n_l->rest_b_)
115             stem_p_->add((Notehead*)info.elem_l_);
116     }
117 }
118 void
119 Stem_beam_register::pre_move_processing()
120 {
121     if (stem_p_) {
122         if (default_dir_i_)
123             stem_p_->dir_i_ = default_dir_i_;
124         
125         typeset_element(stem_p_);
126         stem_p_ = 0;
127     }
128     if (beam_p_ && end_beam_b_) {
129         Rhythmic_grouping const * rg_C = get_staff_info().rhythmic_C_;
130         rg_C->extend(current_grouping->interval());
131         beam_p_->set_grouping(*rg_C, *current_grouping);
132         typeset_element(beam_p_);
133         delete current_grouping;
134         current_grouping = 0;
135         beam_p_ = 0;
136     }
137     end_beam_b_ = false;
138 }
139 void
140 Stem_beam_register::post_move_processing()
141 {
142     stem_p_ = 0;
143     beam_req_l_ = 0;
144     stem_req_l_ = 0;
145     end_beam_b_ = false;
146 }
147
148 Stem_beam_register::~Stem_beam_register()
149 {
150     if (beam_p_)
151         start_req_l_->warning("unterminated beam");
152 }
153
154 void
155 Stem_beam_register::set_feature(Feature i)
156 {
157     if (i.type_ == "vdir")      
158         default_dir_i_ = i.value_;
159 }
160
161 IMPLEMENT_STATIC_NAME(Stem_beam_register);
162 ADD_THIS_REGISTER(Stem_beam_register);