]> git.donarmstrong.com Git - lilypond.git/blob - lily/stem-beam-grav.cc
38f84a48dcae51f548e65184d439a80439b3fbe8
[lilypond.git] / lily / stem-beam-grav.cc
1 /*
2   stem-beam-reg.cc -- part of GNU LilyPond
3
4   (c) 1997 Han-Wen Nienhuys <hanwen@stack.nl>
5 */
6
7 #include "musical-request.hh"
8 #include "stem-beam-grav.hh"
9 #include "beam.hh"
10 #include "stem.hh"
11 #include "grouping.hh"
12 #include "text-spanner.hh"
13 #include "debug.hh"
14 #include "grouping.hh"
15 #include "note-head.hh"
16 #include "time-description.hh"
17
18 Stem_beam_engraver::Stem_beam_engraver()
19 {
20     do_post_move_processing();
21
22     current_grouping = 0;
23     beam_p_ = 0;
24     default_dir_i_ =0;
25     start_req_l_ = 0;
26 }
27
28 bool
29 Stem_beam_engraver::do_try_request(Request*req_l)
30 {
31     
32     Musical_req* mus_l = req_l->musical();
33     /* Debiele puntkomma's. Laat je er eentje per ongeluk achter een
34       if(..) staan, lijkt het net op een luis in gcc.
35
36       (ofwel Python rules)
37       */
38     if (!mus_l)
39         return false;
40
41
42     if ( mus_l->beam() ) {
43         if (bool(beam_p_ ) == bool(mus_l->beam()->spantype == Span_req::START))
44             return false;
45         
46         if (beam_req_l_ && Beam_req::compare(*beam_req_l_ , *mus_l->beam()))
47             return false;
48         
49         beam_req_l_ = mus_l->beam();
50         return true;
51     }
52     
53     if ( mus_l->stem() ) {
54         if (current_grouping && !current_grouping->child_fit_b(
55             get_staff_info().time_C_->whole_in_measure_))
56             return false;
57
58         if (stem_req_l_ && Stem_req::compare(*stem_req_l_, *mus_l->stem()))
59             return false;
60
61         stem_req_l_ = mus_l->stem();
62         return true;
63     }
64     return false;
65 }
66
67 void
68 Stem_beam_engraver::do_process_requests()
69 {
70     if (beam_req_l_) {
71         if (beam_req_l_->spantype == Span_req::STOP) {
72             end_beam_b_ = true;
73             start_req_l_ = 0;
74         } else {
75             beam_p_ = new Beam;
76             start_req_l_ = beam_req_l_;
77             beam_p_->left_col_l_ = get_staff_info().musical_pcol_l();
78             current_grouping = new Rhythmic_grouping;
79             if (beam_req_l_->nplet) {
80                 Text_spanner* t = new Text_spanner();
81                 Text_def *defp = new Text_def;
82                 t->set_support(beam_p_);
83                 defp->align_i_ = 0;
84                 defp->text_str_ = beam_req_l_->nplet;
85                 defp->style_str_="italic";
86                 t->spec_p_  = defp;
87                 announce_element(Score_elem_info(t,0));
88                 typeset_element(t);
89             }
90             announce_element ( Score_elem_info(beam_p_, 0));
91              
92         }
93     }
94
95     if (stem_req_l_) {
96         stem_p_ = new Stem(8);
97         if (current_grouping)
98             current_grouping->add_child(
99                 get_staff_info().time_C_->whole_in_measure_,
100                 stem_req_l_->duration());
101
102         stem_p_->flag_i_ = stem_req_l_->duration_.type_i_;
103
104         if (beam_p_) {
105             if (stem_req_l_->duration_.type_i_<= 4)
106                 stem_req_l_->warning( "stem doesn't fit in Beam");
107             else
108                 beam_p_->add(stem_p_);
109             stem_p_->print_flag_b_ = false;
110         } else {
111             stem_p_->print_flag_b_ = true;
112         }
113         
114         announce_element(Score_elem_info(stem_p_, stem_req_l_));
115     }
116 }
117
118 void
119 Stem_beam_engraver::acknowledge_element(Score_elem_info info)
120 {
121     if (!stem_p_)
122         return;
123
124     if (info.elem_l_->name() == Note_head::static_name() &&
125         stem_req_l_->duration() 
126         == info.req_l_->musical()->rhythmic()->duration()){
127         Note_head * n_l= (Note_head*)info.elem_l_->item();
128         stem_p_->add(n_l);
129     }
130 }
131 void
132 Stem_beam_engraver::do_pre_move_processing()
133 {
134     if (stem_p_) {
135         if (default_dir_i_)
136             stem_p_->dir_i_ = default_dir_i_;
137         
138         typeset_element(stem_p_);
139         stem_p_ = 0;
140     }
141     if (beam_p_ && end_beam_b_) {
142         Rhythmic_grouping const * rg_C = get_staff_info().rhythmic_C_;
143         rg_C->extend(current_grouping->interval());
144         beam_p_->set_grouping(*rg_C, *current_grouping);
145         beam_p_->right_col_l_ = get_staff_info().musical_pcol_l();
146         typeset_element(beam_p_);
147         delete current_grouping;
148         current_grouping = 0;
149         beam_p_ = 0;
150     }
151     end_beam_b_ = false;
152 }
153 void
154 Stem_beam_engraver::do_post_move_processing()
155 {
156     stem_p_ = 0;
157     beam_req_l_ = 0;
158     stem_req_l_ = 0;
159     end_beam_b_ = false;
160 }
161
162 Stem_beam_engraver::~Stem_beam_engraver()
163 {
164     if (beam_p_)
165         start_req_l_->warning("unterminated beam");
166 }
167
168 void
169 Stem_beam_engraver::set_feature(Feature i)
170 {
171     if (i.type_ == "vdir")      
172         default_dir_i_ = i.value_;
173 }
174
175
176 IMPLEMENT_IS_TYPE_B1(Stem_beam_engraver,Engraver);
177 ADD_THIS_ENGRAVER(Stem_beam_engraver);