]> git.donarmstrong.com Git - lilypond.git/blob - lily/multi-measure-rest-engraver.cc
release: 1.1.24
[lilypond.git] / lily / multi-measure-rest-engraver.cc
1 /*
2   multi_measure_rest-engraver.cc -- implement Multi_measure_rest_engraver
3
4   (c) 1998 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 "paper-score.hh"
15 //#include "p-score.hh"
16 //#include "paper-def.hh"
17 //#include "main.hh"
18 //#include "global-translator.hh"
19 #include "bar.hh"
20
21
22 ADD_THIS_TRANSLATOR (Multi_measure_rest_engraver);
23
24 Multi_measure_rest_engraver::Multi_measure_rest_engraver ()
25 {
26   start_measure_i_ = 0;
27   rest_moments_[START] =
28     rest_moments_[STOP] =0;
29   multi_measure_req_l_ = 0;
30   mmrest_p_ = 0;
31 }
32
33 void
34 Multi_measure_rest_engraver::acknowledge_element (Score_element_info i)
35 {
36   if (Bar *c = dynamic_cast<Bar*> (i.elem_l_))
37     {
38       if (mmrest_p_) 
39         mmrest_p_->add_column (c);
40       if (lastrest_p_)
41         lastrest_p_->add_column (c);
42     }
43 }
44
45 bool
46 Multi_measure_rest_engraver::do_try_music (Music* req_l)
47 {
48  if (Multi_measure_rest_req *mr = dynamic_cast<Multi_measure_rest_req *> (req_l))
49    {
50      if (multi_measure_req_l_)
51        if (!multi_measure_req_l_->equal_b (mr)
52            || rest_moments_[START] != now_moment ())
53          return false;
54   
55      multi_measure_req_l_ = mr;
56      rest_moments_[START] = now_moment ();
57      
58      rest_moments_[STOP] = rest_moments_[START] + multi_measure_req_l_->duration_.length ();
59      return true;
60    }
61  return false;
62 }
63
64 void
65 Multi_measure_rest_engraver::do_process_requests ()
66 {
67   if (multi_measure_req_l_ && !mmrest_p_)
68     {
69       Time_description const *time = get_staff_info().time_C_;
70       mmrest_p_ = new Multi_measure_rest;
71       announce_element (Score_element_info (mmrest_p_, multi_measure_req_l_));
72       start_measure_i_ = time->bars_i_;
73     }
74 }
75
76 void
77 Multi_measure_rest_engraver::do_pre_move_processing ()
78 {
79   Moment now (now_moment ());
80   Time_description const *time = get_staff_info().time_C_;
81   if (mmrest_p_ && (now >= rest_moments_[START]) 
82     && !time->whole_in_measure_
83     && (mmrest_p_->column_arr_.size () >= 2))
84     {
85       typeset_element (mmrest_p_);
86       /*
87         must keep mmrest_p_ around to set measures_i_
88        */
89     }
90   if (lastrest_p_)
91     {
92       typeset_element (lastrest_p_);
93       lastrest_p_ = 0;
94     }
95 }
96
97 void
98 Multi_measure_rest_engraver::do_post_move_processing ()
99 {
100   Time_description const *time = get_staff_info().time_C_;
101   Moment now (now_moment ());
102
103   if (mmrest_p_ && !time->whole_in_measure_)
104     {
105       lastrest_p_ = mmrest_p_;
106       lastrest_p_->measures_i_ = time->bars_i_ - start_measure_i_;
107       mmrest_p_ = 0;
108     }
109
110   if (now >= rest_moments_[STOP])
111     {
112       multi_measure_req_l_ = 0;
113       mmrest_p_ = 0;
114     }
115 }
116