]> git.donarmstrong.com Git - lilypond.git/blob - lily/multi-measure-rest-engraver.cc
release: 1.1.35
[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  if (Multi_measure_rest_req *mr = dynamic_cast<Multi_measure_rest_req *> (req_l))
46    {
47      if (multi_measure_req_l_)
48        if (!multi_measure_req_l_->equal_b (mr)
49            || rest_moments_[START] != now_mom ())
50          return false;
51   
52      multi_measure_req_l_ = mr;
53      rest_moments_[START] = now_mom ();
54      
55      rest_moments_[STOP] = rest_moments_[START] + multi_measure_req_l_->duration_.length_mom ();
56      return true;
57    }
58  return false;
59 }
60
61 void
62 Multi_measure_rest_engraver::do_process_requests ()
63 {
64   if (multi_measure_req_l_ && !mmrest_p_)
65     {
66       Time_description const *time = get_staff_info().time_C_;
67       mmrest_p_ = new Multi_measure_rest;
68       announce_element (Score_element_info (mmrest_p_, multi_measure_req_l_));
69       start_measure_i_ = time->bars_i_;
70     }
71 }
72
73 void
74 Multi_measure_rest_engraver::do_pre_move_processing ()
75 {
76   Moment now (now_mom ());
77   Time_description const *time = get_staff_info().time_C_;
78   if (mmrest_p_ && (now >= rest_moments_[START]) 
79     && !time->whole_in_measure_
80     && (mmrest_p_->column_arr_.size () >= 2))
81     {
82       typeset_element (mmrest_p_);
83       /*
84         must keep mmrest_p_ around to set measures_i_
85        */
86     }
87   if (lastrest_p_)
88     {
89       typeset_element (lastrest_p_);
90       lastrest_p_ = 0;
91     }
92 }
93
94 void
95 Multi_measure_rest_engraver::do_post_move_processing ()
96 {
97   Time_description const *time = get_staff_info().time_C_;
98   Moment now (now_mom ());
99
100   if (mmrest_p_ && !time->whole_in_measure_)
101     {
102       lastrest_p_ = mmrest_p_;
103       lastrest_p_->measures_i_ = time->bars_i_ - start_measure_i_;
104       mmrest_p_ = 0;
105     }
106
107   if (now >= rest_moments_[STOP])
108     {
109       multi_measure_req_l_ = 0;
110       mmrest_p_ = 0;
111     }
112 }
113