]> git.donarmstrong.com Git - lilypond.git/blob - lily/multi-measure-rest-engraver.cc
release: 1.1.1
[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
15 IMPLEMENT_IS_TYPE_B1 (Multi_measure_rest_engraver, Engraver);
16 ADD_THIS_TRANSLATOR (Multi_measure_rest_engraver);
17
18 Multi_measure_rest_engraver::Multi_measure_rest_engraver ()
19 {
20   start_measure_i_ = 0;
21   rest_item_creation_mom_ = rest_req_stop_mom_ =0;
22   multi_measure_req_l_ = 0;
23   mmrest_p_ = 0;
24 }
25
26 bool
27 Multi_measure_rest_engraver::do_try_request (Request* req_l)
28 {
29  if (Multi_measure_rest_req *mr = dynamic_cast<Multi_measure_rest_req *> (req_l))
30    {
31      if (multi_measure_req_l_)
32        if (!multi_measure_req_l_->equal_b (req_l)
33            || req_start_mom_ != now_moment ())
34          return false;
35   
36      multi_measure_req_l_ = mr;
37      req_start_mom_ = now_moment ();
38      
39      rest_req_stop_mom_ = req_start_mom_ + multi_measure_req_l_->duration_.length ();
40      return true;
41    }
42  return false;
43 }
44
45 void
46 Multi_measure_rest_engraver::do_process_requests ()
47 {
48   if (multi_measure_req_l_ && !mmrest_p_)
49     {
50       Time_description const *time = get_staff_info().time_C_;
51       mmrest_p_ = new Multi_measure_rest;
52       rest_item_creation_mom_ =  time->when_mom ();
53       announce_element (Score_element_info (mmrest_p_, multi_measure_req_l_));
54       start_measure_i_ = time->bars_i_;
55     }
56 }
57
58 void
59 Multi_measure_rest_engraver::do_pre_move_processing ()
60 {
61   Moment now (now_moment ());
62   if (mmrest_p_ && rest_item_creation_mom_ == now)
63     {
64       typeset_element (mmrest_p_);
65     }
66 }
67
68 void
69 Multi_measure_rest_engraver::do_post_move_processing ()
70 {
71   Time_description const *time = get_staff_info().time_C_;
72   Moment now (now_moment ());
73   if (rest_req_stop_mom_ <= now)
74     multi_measure_req_l_ = 0;
75
76   if (mmrest_p_ && (!time->whole_in_measure_ || !multi_measure_req_l_))
77     {
78       assert (rest_item_creation_mom_ < now);
79       mmrest_p_->measures_i_ = time->bars_i_ - start_measure_i_;
80       mmrest_p_ = 0;
81     }
82 }