]> git.donarmstrong.com Git - lilypond.git/blob - lily/multi-measure-rest-engraver.cc
patch::: 1.1.19.jcn1: vlees
[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 "p-score.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_item_creation_mom_ = rest_req_stop_mom_ =0;
23   multi_measure_req_l_ = 0;
24   mmrest_p_ = 0;
25 }
26
27 bool
28 Multi_measure_rest_engraver::do_try_music (Music* req_l)
29 {
30  if (Multi_measure_rest_req *mr = dynamic_cast<Multi_measure_rest_req *> (req_l))
31    {
32      if (multi_measure_req_l_)
33        if (!multi_measure_req_l_->equal_b (mr)
34            || req_start_mom_ != now_moment ())
35          return false;
36   
37      multi_measure_req_l_ = mr;
38      req_start_mom_ = now_moment ();
39      
40      rest_req_stop_mom_ = req_start_mom_ + multi_measure_req_l_->duration_.length ();
41      return true;
42    }
43  return false;
44 }
45
46 void
47 Multi_measure_rest_engraver::do_process_requests ()
48 {
49   if (multi_measure_req_l_ && !mmrest_p_)
50     {
51       Time_description const *time = get_staff_info().time_C_;
52       mmrest_p_ = new Multi_measure_rest;
53       rest_item_creation_mom_ = time->when_mom ();
54
55       rest_item_creation_mom_ += time->whole_per_measure_ / Moment (2);
56 #if 0
57       // core dump because of missing column?
58       mmrest_p_->pscore_l_->add_column (new Score_column (rest_item_creation_mom_));
59       mmrest_p_->pscore_l_->add_column (new Score_column (rest_item_creation_mom_, true));
60 #endif
61
62       announce_element (Score_element_info (mmrest_p_, multi_measure_req_l_));
63       start_measure_i_ = time->bars_i_;
64     }
65 }
66
67 void
68 Multi_measure_rest_engraver::do_pre_move_processing ()
69 {
70   Moment now (now_moment ());
71   if (mmrest_p_ && rest_item_creation_mom_ == now)
72     {
73       typeset_element (mmrest_p_);
74     }
75 }
76
77 void
78 Multi_measure_rest_engraver::do_post_move_processing ()
79 {
80   Time_description const *time = get_staff_info().time_C_;
81   Moment now (now_moment ());
82   if (rest_req_stop_mom_ <= now)
83     multi_measure_req_l_ = 0;
84
85   if (mmrest_p_ && (!time->whole_in_measure_ || !multi_measure_req_l_))
86     {
87       assert (rest_item_creation_mom_ < now);
88       mmrest_p_ = 0;
89     }
90 }