]> git.donarmstrong.com Git - lilypond.git/blob - lily/note-column.cc
release: 0.1.63
[lilypond.git] / lily / note-column.cc
1 /*
2   note-column.cc -- implement Note_column
3
4   source file of the GNU LilyPond music typesetter
5
6   (c)  1997--1998 Han-Wen Nienhuys <hanwen@stack.nl>
7 */
8 #include "dot-column.hh"
9 #include "note-column.hh"
10 #include "script.hh"
11 #include "note-head.hh"
12 #include "stem.hh"
13 #include "rest.hh"
14 #include "debug.hh"
15
16 IMPLEMENT_IS_TYPE_B1(Note_column,Script_column);
17
18 bool
19 Note_column::rest_b () const
20 {
21   return rest_l_arr_.size ();
22 }
23
24 Note_column::Note_column()
25 {
26   stem_l_ = 0;
27   h_shift_b_ = false;
28   dir_ =CENTER;
29 }
30
31 void
32 Note_column::sort()
33 {
34   head_l_arr_.sort (Note_head::compare);
35 }
36   
37 Interval_t<int>
38 Note_column::head_positions_interval() const
39 {
40   ((Note_column*)this)->sort();
41   return Interval_t<int> (head_l_arr_[0]->position_i_, 
42                           head_l_arr_.top()->position_i_);
43
44 }
45
46 Interval 
47 Note_column::width () const
48 {
49   if (head_l_arr_.size ())
50     return head_l_arr_[0]->width ();
51   else
52     return Interval (0,0);
53 }
54
55 void
56 Note_column::do_pre_processing()
57 {
58
59   if (!dir_)
60     {
61       if (stem_l_)
62         dir_ = stem_l_->dir_;
63       else if (head_l_arr_.size ())
64         {
65           dir_ = (head_positions_interval().center () >=  5) ? DOWN:UP;
66         }
67     }
68   Script_column::do_pre_processing();
69 }
70
71   
72
73 void
74 Note_column::set (Stem * stem_l)
75 {
76   add_support (stem_l);
77   stem_l_ = stem_l;
78   /* 
79      don't add stem to support; mostly invisible for rest-columns (and possibly taken . .)
80    */
81   Score_elem::add_dependency (stem_l);
82   for (int i=0; i < script_l_arr_.size(); i++)
83     script_l_arr_[i]->set_stem (stem_l);
84 }
85
86 void
87 Note_column::add (Script *script_l)
88 {
89   Script_column::add (script_l) ;
90   if  (stem_l_)
91     script_l->set_stem (stem_l_);
92 }
93
94 void
95 Note_column::do_substitute_dependency (Score_elem*o, Score_elem*n)
96 {
97   if (stem_l_ == o) 
98     {
99       stem_l_ = n ? (Stem*)n->item():0;
100     }
101   if (o->is_type_b (Note_head::static_name ()))
102     {
103       head_l_arr_.substitute ((Note_head*)o->item(), 
104                               (n)? (Note_head*)n->item() : 0);
105     }
106   Script_column::do_substitute_dependency (o,n);
107   if (o->is_type_b (Rest::static_name ())) 
108     {
109       rest_l_arr_.substitute ((Rest*)o->item(), 
110                               (n)? (Rest*)n->item() : 0);
111     }
112 }
113
114 void
115 Note_column::add (Rhythmic_head *h)
116 {
117   if (h->is_type_b (Rest::static_name ()))
118     {
119       rest_l_arr_.push ((Rest*)h);
120       add_support (h);  
121     }
122   if (h->is_type_b (Note_head::static_name ()))
123     {
124       head_l_arr_.push ((Note_head*) h);
125       add_support (h);
126     }
127 }
128
129 /**
130   translate the rest symbols
131  */
132 void
133 Note_column::translate_rests (int dy_i)
134 {
135   invalidate_cache (Y_AXIS);
136   for (int i=0; i < rest_l_arr_.size(); i++)
137     rest_l_arr_[i]->position_i_ += dy_i;
138 }
139
140 void
141 Note_column::do_print() const
142 {
143 #ifndef NPRINT
144   DOUT << "rests: " << rest_l_arr_.size() << ", ";
145   DOUT << "heads: " << head_l_arr_.size();
146 #endif
147 }
148
149 void
150 Note_column::set (Dot_column *d)
151 {
152   add_element (d);
153 }