]> git.donarmstrong.com Git - lilypond.git/blob - lily/multi-measure-rest-engraver.cc
51ff44654231651913b3ddc33fbe5a4ae4449007
[lilypond.git] / lily / multi-measure-rest-engraver.cc
1 /*
2   multi_measure_rest-engraver.cc -- implement Multi_measure_rest_engraver
3
4   (c) 1998--1999 Jan Nieuwenhuizen <janneke@gnu.org>
5        Han-Wen Nienhuys <hanwen@cs.uu.nl>
6 */
7
8 #include "proto.hh"
9 #include "musical-request.hh"
10 #include "multi-measure-rest.hh"
11 #include "multi-measure-rest-engraver.hh"
12 #include "score-column.hh"
13 #include "time-description.hh"
14 #include "bar.hh"
15
16
17 ADD_THIS_TRANSLATOR (Multi_measure_rest_engraver);
18
19 Multi_measure_rest_engraver::Multi_measure_rest_engraver ()
20 {
21   start_measure_i_ = 0;
22   rest_moments_[START] =
23     rest_moments_[STOP] =0;
24   multi_measure_req_l_ = 0;
25
26   lastrest_p_ =0;
27   mmrest_p_ = 0;
28 }
29
30 void
31 Multi_measure_rest_engraver::acknowledge_element (Score_element_info i)
32 {
33   if (Bar *c = dynamic_cast<Bar*> (i.elem_l_))
34     {
35       if (mmrest_p_) 
36         mmrest_p_->add_column (c);
37       if (lastrest_p_)
38         lastrest_p_->add_column (c);
39     }
40 }
41
42 bool
43 Multi_measure_rest_engraver::do_try_music (Music* req_l)
44 {
45   Rhythmic_req *r=0;
46   if (Multi_measure_rest_req *mr = 
47       dynamic_cast<Multi_measure_rest_req *> (req_l))
48     r=mr;
49   else if (Repetitions_req *rr = 
50            dynamic_cast<Repetitions_req *> (req_l))
51     r=rr;
52   if (r)
53     {
54       if (multi_measure_req_l_)
55         if (!multi_measure_req_l_->equal_b (r)
56             || rest_moments_[START] != now_mom ())
57           return false;
58       
59       multi_measure_req_l_ = r;
60       rest_moments_[START] = now_mom ();
61       
62       rest_moments_[STOP] = rest_moments_[START] +
63         multi_measure_req_l_->duration_.length_mom ();
64       return true;
65     }
66   return false;
67 }
68
69 void
70 Multi_measure_rest_engraver::do_process_requests ()
71 {
72   if (multi_measure_req_l_ && !mmrest_p_)
73     {
74       Time_description const *time = get_staff_info().time_C_;
75       mmrest_p_ = new Multi_measure_rest;
76       if(dynamic_cast<Repetitions_req *> (multi_measure_req_l_))
77         mmrest_p_->set_elt_property (alt_symbol_scm_sym, 
78                                      ly_ch_C_to_scm ("scripts-repeatsign"));
79       announce_element (Score_element_info (mmrest_p_, multi_measure_req_l_));
80       start_measure_i_ = time->bars_i_;
81     }
82 }
83
84 void
85 Multi_measure_rest_engraver::do_pre_move_processing ()
86 {
87   Moment now (now_mom ());
88   Time_description const *time = get_staff_info().time_C_;
89   if (mmrest_p_ && (now >= rest_moments_[START]) 
90     && !time->whole_in_measure_
91     && (mmrest_p_->column_arr_.size () >= 2))
92     {
93       typeset_element (mmrest_p_);
94       /*
95         must keep mmrest_p_ around to set measures_i_
96        */
97     }
98   if (lastrest_p_)
99     {
100       typeset_element (lastrest_p_);
101       lastrest_p_ = 0;
102     }
103 }
104
105 void
106 Multi_measure_rest_engraver::do_post_move_processing ()
107 {
108   Time_description const *time = get_staff_info().time_C_;
109   Moment now (now_mom ());
110
111   if (mmrest_p_ && !time->whole_in_measure_)
112     {
113       lastrest_p_ = mmrest_p_;
114       lastrest_p_->measures_i_ = time->bars_i_ - start_measure_i_;
115       mmrest_p_ = 0;
116     }
117
118   if (now >= rest_moments_[STOP])
119     {
120       multi_measure_req_l_ = 0;
121       mmrest_p_ = 0;
122     }
123 }
124