]> git.donarmstrong.com Git - lilypond.git/blob - lily/dynamic-reg.cc
release: 0.0.50
[lilypond.git] / lily / dynamic-reg.cc
1 /*
2   dynamic-reg.cc -- implement Dynamic_register
3
4   source file of the LilyPond music typesetter
5
6   (c) 1997 Han-Wen Nienhuys <hanwen@stack.nl>
7 */
8 #include "debug.hh"
9 #include "crescendo.hh"
10 #include "dynamic-reg.hh"
11 #include "musical-request.hh"
12 #include "text-item.hh"
13 #include "lookup.hh"
14 #include "paper-def.hh"
15 #include "score-column.hh"
16 #include "staff-sym.hh"
17
18 Dynamic_register::Dynamic_register()
19 {
20     dir_i_ =0;
21     post_move_processing();
22     dynamic_p_ =0;
23     to_end_cresc_p_ = cresc_p_ = 0;
24     cresc_req_l_ = 0;
25 }
26
27 void
28 Dynamic_register::post_move_processing()
29 {
30     dynamic_req_l_arr_.set_size(0);
31 }
32
33 bool    
34 Dynamic_register::try_request(Request * r)
35 {
36     Musical_req * m = r->musical();
37     if (!m || !m->dynamic())
38         return false;
39     dynamic_req_l_arr_.push(m->dynamic());
40     return true;
41 }
42 void
43 Dynamic_register::process_requests()
44 {
45     Crescendo*  new_cresc_p=0; 
46     for (int i=0; i < dynamic_req_l_arr_.size(); i++) {
47         Dynamic_req *dreq_l = dynamic_req_l_arr_[i];
48         if (dreq_l->absdynamic()) {
49             Text_def * td_p = new Text_def;
50             td_p->align_i_ = 0;
51             String loud =Dynamic_req::loudness_str(
52                 dreq_l->absdynamic()->loudness_);
53             
54             td_p->text_str_ = paper()->lookup_l()->dynamic(loud).tex;
55             td_p->style_str_ = "dynamic";
56
57             assert (!dynamic_p_) ; // TODO
58                 
59             dynamic_p_ = new Text_item(td_p);
60             announce_element(Staff_elem_info(dynamic_p_, dreq_l));
61         } else if (dreq_l->span_dynamic()) {
62
63             Span_dynamic_req* span_l = dreq_l->span_dynamic();
64             if (span_l->spantype == Span_req::STOP) {
65                 if (!cresc_p_) {
66                     span_l->warning("Can't find cresc to end " );
67                 } else {
68                     assert(!to_end_cresc_p_);
69                     to_end_cresc_p_ =cresc_p_;
70                     cresc_p_ = 0;
71                 }
72             } else if (span_l->spantype == Span_req::START) {
73                 cresc_req_l_ = span_l;
74                 assert(!new_cresc_p);
75                 new_cresc_p  = new Crescendo;
76                 new_cresc_p->grow_dir_i_ = span_l->dynamic_dir_i_;
77                 announce_element(Staff_elem_info(new_cresc_p, span_l));
78             }
79         }
80     }
81
82     if ( new_cresc_p ) {
83         cresc_p_ = new_cresc_p;
84         cresc_p_->left_col_l_ = get_staff_info().musical_l()->pcol_l_;
85         if (dynamic_p_) {
86             cresc_p_->left_dyn_b_ = true;
87         }
88     }
89 }
90
91 void
92 Dynamic_register::pre_move_processing()
93 {
94     Staff_symbol* s_l = get_staff_info().staff_sym_l_;
95     if (dynamic_p_) {
96         dynamic_p_->set_staffsym(s_l);
97         typeset_element(dynamic_p_);
98         dynamic_p_ = 0;
99     }
100     if ( to_end_cresc_p_) {
101         if (dynamic_p_)
102             to_end_cresc_p_->right_dyn_b_=true;
103         
104         to_end_cresc_p_->right_col_l_ = get_staff_info().musical_l()->pcol_l_;
105         to_end_cresc_p_->set_staffsym(s_l);
106         typeset_element(to_end_cresc_p_);
107         to_end_cresc_p_ = 0;
108     }
109 }
110
111 bool
112 Dynamic_register::acceptable_request_b(Request*r)const
113 {
114     Musical_req * m = r->musical();
115     return  (m && m->dynamic());
116 }
117
118 void
119 Dynamic_register::set_feature(Features i)
120 {
121     dir_i_ = i.direction_i_;
122 }
123
124 IMPLEMENT_STATIC_NAME(Dynamic_register);
125 ADD_THIS_REGISTER(Dynamic_register);
126
127 Dynamic_register::~Dynamic_register()
128 {
129     delete dynamic_p_;
130     delete to_end_cresc_p_;
131     if (cresc_p_) {
132         cresc_req_l_->warning("unended crescendo");
133     }
134     delete cresc_p_;
135 }