]> git.donarmstrong.com Git - lilypond.git/blob - lily/slur-reg.cc
release: 0.0.59
[lilypond.git] / lily / slur-reg.cc
1 /*
2   slur-reg.cc -- implement Slur_register
3
4   (c) 1997 Han-Wen Nienhuys <hanwen@stack.nl>
5 */
6
7 #include "proto.hh"
8 #include "plist.hh"
9 #include "musical-request.hh"
10 #include "complex-walker.hh"
11 #include "slur-reg.hh"
12 #include "slur.hh"
13 #include "debug.hh"
14 #include "note-column.hh"
15
16 bool
17 Slur_register::acceptable_request_b(Request*req_l)
18 {
19     return req_l->musical() && req_l->musical()->slur();
20 }
21
22 bool
23 Slur_register::try_request(Request *req_l)
24 {
25     if(!req_l->slur())
26         return false;
27
28     new_slur_req_l_arr_.push(req_l->slur());
29     return true;
30 }
31
32 void
33 Slur_register::acknowledge_element(Staff_elem_info info)
34 {
35     if (info.elem_l_->name() == Note_column::static_name()) { 
36         Note_column *col_l =(Note_column*) info.elem_l_ ;// ugh
37         for (int i = 0; i < slur_l_stack_.size(); i++)
38             slur_l_stack_[i]->add(col_l );
39         for (int i = 0; i < end_slur_l_arr_.size(); i++)
40             end_slur_l_arr_[i]->add(col_l);
41     }
42 }
43 /*
44   abracadabra
45   */
46 void
47 Slur_register::process_requests()
48 {
49     Array<Slur*> start_slur_l_arr_;
50     for (int i=0; i< new_slur_req_l_arr_.size(); i++) {
51         Slur_req* slur_req_l = new_slur_req_l_arr_[i];
52         // end slur: move the slur to other array
53         if (slur_req_l->spantype == Span_req::STOP) {
54             if (slur_l_stack_.empty())
55                 
56                       slur_req_l->warning("can't find slur to end");
57             else {
58                 end_slur_l_arr_.push(slur_l_stack_.pop());
59                 requests_arr_.pop();
60             }
61         } else  if (slur_req_l->spantype == Span_req::START) {
62             // push a new slur onto stack.
63             //(use temp. array to wait for all slur STOPs)
64             Slur * s_p =new Slur;
65             requests_arr_.push(slur_req_l);
66             start_slur_l_arr_.push(s_p);
67             announce_element(Staff_elem_info(s_p, slur_req_l));
68         }
69     }
70     for (int i=0; i < start_slur_l_arr_.size(); i++)
71         slur_l_stack_.push(start_slur_l_arr_[i]);
72 }
73
74 void
75 Slur_register::pre_move_processing()
76 {
77     for (int i = 0; i < end_slur_l_arr_.size(); i++) {
78         typeset_element(end_slur_l_arr_[i]);
79     }
80     end_slur_l_arr_.set_size(0);
81 }
82
83 void
84 Slur_register::post_move_processing()
85 {
86     new_slur_req_l_arr_.set_size(0);
87 }
88 Slur_register::~Slur_register()
89 {
90     for (int i=0; i < requests_arr_.size(); i++) {
91         requests_arr_[i]->warning("unterminated slur");
92     }
93 }
94 IMPLEMENT_STATIC_NAME(Slur_register);
95 ADD_THIS_REGISTER(Slur_register);