/*
note-column.cc -- implement Note_column
- source file of the LilyPond music typesetter
+ source file of the GNU LilyPond music typesetter
- (c) 1997 Han-Wen Nienhuys <hanwen@stack.nl>
+ (c) 1997--1999 Han-Wen Nienhuys <hanwen@cs.uu.nl>
*/
-
+#include "dot-column.hh"
#include "note-column.hh"
-#include "debug.hh"
#include "script.hh"
-#include "notehead.hh"
+#include "note-head.hh"
#include "stem.hh"
+#include "rest.hh"
+#include "debug.hh"
-IMPLEMENT_STATIC_NAME(Note_column);
+bool
+Note_column::rest_b () const
+{
+ return rest_l_arr_.size ();
+}
+Note_column::Note_column()
+{
+ stem_l_ = 0;
+ h_shift_b_ = false;
+ dir_ =CENTER;
+}
void
-Note_column::add(Stem*stem_l)
+Note_column::sort()
+{
+ head_l_arr_.sort (Note_head::compare);
+}
+
+Interval_t<int>
+Note_column::head_positions_interval() const
{
- assert(!stem_l_);
- stem_l_ = stem_l;
- add_dependency(stem_l);
+ ((Note_column*)this)->sort();
+ Interval_t<int> iv;
+
+ iv.set_empty ();
+
+ if (head_l_arr_.size ())
+ iv = Interval_t<int>(head_l_arr_[0]->position_i_,
+ head_l_arr_.top()->position_i_);
+
+ return iv;
}
void
-Note_column::add(Notehead* n_l)
+Note_column::do_pre_processing()
{
- head_l_arr_.push(n_l);
- add_dependency(n_l);
+ if (!dir_)
+ {
+ if (stem_l_)
+ dir_ = stem_l_->dir_;
+ else if (head_l_arr_.size ())
+ {
+ // assert (false); // looks obsolete?
+ dir_ = sign (head_positions_interval().center ());
+ }
+ }
+ Script_column::do_pre_processing();
}
+
+
void
-Note_column::add(Script*s_l)
+Note_column::set_stem (Stem * stem_l)
{
- script_l_arr_.push(s_l);
- add_dependency(s_l);
+ add_support (stem_l);
+ stem_l_ = stem_l;
+ /*
+ don't add stem to support; mostly invisible for rest-columns (and possibly taken . .)
+ */
+ Score_element::add_dependency (stem_l);
+ for (int i=0; i < script_l_arr_.size(); i++)
+ script_l_arr_[i]->set_stem (stem_l);
}
void
-Note_column::translate(Offset o)
+Note_column::add_script (Script *script_l)
{
- for (int i=0; i < head_l_arr_.size(); i++)
- head_l_arr_[i]->translate(o);
- for (int i=0; i < script_l_arr_.size(); i++)
- script_l_arr_[i]->translate(o);
- if (stem_l_)
- stem_l_->translate(o);
+ Script_column::add_script (script_l) ;
+ if (stem_l_)
+ script_l->set_stem (stem_l_);
}
-
void
-Note_column::do_print()const
+Note_column::do_substitute_element_pointer (Score_element*o, Score_element*n)
{
- mtor << "heads: " << head_l_arr_.size() << '\n';
- mtor << "scripts: " << script_l_arr_.size() << '\n';
+ if (stem_l_ == o)
+ {
+ stem_l_ = n ? dynamic_cast<Stem *> (n):0;
+ }
+ if (dynamic_cast<Note_head *> (o))
+ {
+ head_l_arr_.substitute (dynamic_cast<Note_head *> (o),
+ (n)? dynamic_cast<Note_head *> (n) : 0);
+ }
+ Script_column::do_substitute_element_pointer (o,n);
+ if (dynamic_cast<Rest *> (o))
+ {
+ rest_l_arr_.substitute (dynamic_cast<Rest *> (o),
+ (n)? dynamic_cast<Rest *> (n) : 0);
+ }
}
-Interval
-Note_column::do_height()const return r
+void
+Note_column::add_head (Rhythmic_head *h)
{
- if (stem_l_)
- r.unite(stem_l_->height());
- for (int i=0; i < head_l_arr_.size(); i++)
- r.unite(head_l_arr_[i]->height());
- for (int i=0; i < script_l_arr_.size(); i++)
- r.unite(script_l_arr_[i]->height());
+ if (Rest*r=dynamic_cast<Rest *> (h))
+ {
+ rest_l_arr_.push (r);
+ add_support (r);
+ }
+ if (Note_head *nh=dynamic_cast<Note_head *> (h))
+ {
+ head_l_arr_.push (nh);
+ add_support (nh);
+ }
}
-Interval
-Note_column::do_width()const return r;
+/**
+ translate the rest symbols
+ */
+void
+Note_column::translate_rests (int dy_i)
{
- if (stem_l_)
- r.unite(stem_l_->width());
- for (int i=0; i < head_l_arr_.size(); i++)
- r.unite(head_l_arr_[i]->width());
- for (int i=0; i < script_l_arr_.size(); i++)
- r.unite(script_l_arr_[i]->width());
+ invalidate_cache (Y_AXIS);
+ for (int i=0; i < rest_l_arr_.size(); i++)
+ rest_l_arr_[i]->position_i_ += dy_i;
}
void
-Note_column::do_pre_processing()
+Note_column::do_print() const
{
- if (!script_l_arr_.size())
- return;
-
- Array<Script*> placed_l_arr_a[4];
- for (int i=0; i < script_l_arr_.size(); i++) {
- Script*s_l = script_l_arr_[i];
- int j = (s_l->dir_i_ >0) ? 0 : 2;
- if (!s_l->inside_staff_b_)
- j ++;
-
- placed_l_arr_a[j].push(s_l);
- }
- for (int j =0; j <4; j++) {
- placed_l_arr_a[j].sort( Script::compare);
- }
-
- Notehead *top_head_l=0;
- Notehead *bot_head_l=0;
- for (int i=0; i< head_l_arr_.size(); i++) {
- if (head_l_arr_[i]->extremal == -1)
- bot_head_l = head_l_arr_[i];
- else if (head_l_arr_[i]->extremal == 1)
- top_head_l = head_l_arr_[i];
- }
- /* argh. This sux. */
- if (!top_head_l)
- top_head_l = bot_head_l;
- if (!bot_head_l)
- bot_head_l = top_head_l;
- assert(bot_head_l && top_head_l);
- Item *support_l=top_head_l;
- int j;
- for (j = 0; j < 2; j++ ) {
- for (int i=0; i < placed_l_arr_a[j].size(); j++) {
- placed_l_arr_a[j][i]->add_support(support_l);
- support_l = placed_l_arr_a[j][i];
- }
- }
-
- support_l=bot_head_l;
- for (; j < 4; j++ ) {
- for (int i=0; i < placed_l_arr_a[j].size(); i++) {
- placed_l_arr_a[j][i]->add_support(support_l);
- support_l = placed_l_arr_a[j][i];
- }
- }
+#ifndef NPRINT
+ DOUT << "rests: " << rest_l_arr_.size() << ", ";
+ DOUT << "heads: " << head_l_arr_.size();
+#endif
}
-Note_column::Note_column()
+
+void
+Note_column::set_dotcol (Dot_column *d)
{
- stem_l_ =0;
+ add_element (d);
}
-