]> git.donarmstrong.com Git - lilypond.git/blob - lily/multi-measure-rest-engraver.cc
patch::: 1.1.19.jcn2: Re: niew trei
[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_stop_mom_ =0;
28   // rest_item_creation_mom_ = 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_start_mom_ != now_moment ())
53          return false;
54   
55      multi_measure_req_l_ = mr;
56      rest_start_mom_ = now_moment ();
57      
58      rest_stop_mom_ = rest_start_mom_ + 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       // rest_item_creation_mom_ = time->when_mom ();
72       announce_element (Score_element_info (mmrest_p_, multi_measure_req_l_));
73       start_measure_i_ = time->bars_i_;
74     }
75 }
76
77 void
78 Multi_measure_rest_engraver::do_pre_move_processing ()
79 {
80   Moment now (now_moment ());
81   //urg lily dumps core if i want to let her print all (SkipBars=0) rests...
82 #if 0
83   if (mmrest_p_ && (now >= rest_start_mom_) && (mmrest_p_->column_arr_.size () >= 2))
84     {
85       typeset_element (mmrest_p_);
86     }
87 #endif
88   if (lastrest_p_)
89     {
90       typeset_element (lastrest_p_);
91       lastrest_p_ = 0;
92     }
93 }
94
95 void
96 Multi_measure_rest_engraver::do_post_move_processing ()
97 {
98   Time_description const *time = get_staff_info().time_C_;
99   Moment now (now_moment ());
100
101   /*
102    when our time's up, calculate the number of bars rest and
103    make way for new request
104    however, linger around a bit to catch this last column when
105    its announced
106    */
107   if (mmrest_p_ && (now >= rest_stop_mom_)) //&& (!time->whole_in_measure_))
108     {
109       lastrest_p_ = mmrest_p_;
110       lastrest_p_->measures_i_ = time->bars_i_ - start_measure_i_;
111       //urg lily dumps core if i want to let her print all (SkipBars=0) rests...
112 #if 0
113       if (lastrest_p_->column_arr_.size () >= 2)
114         lastrest_p_ = 0;
115 #endif
116       multi_measure_req_l_ = 0;
117       mmrest_p_ = 0;
118     }
119 }
120