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