]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/slur.cc
release: 0.1.12
[lilypond.git] / lily / slur.cc
index 57f6ab649f43a9cc2203a591fe0de6e59d112afc..a4349ab750a06095055957dd57408138b2813f7a 100644 (file)
@@ -7,12 +7,10 @@
 */
 
 /*
-
   TODO:
   
   think about crossing stems.
   Begin and end should be treated as a Script.
-  
  */
 #include "slur.hh"
 #include "scalar.hh"
 
 
 void
-Slur::add(Note_column*n)
+Slur::add (Note_column*n)
 {
-    encompass_arr_.push(n);
-    add_dependency(n);
+  encompass_arr_.push (n);
+  add_dependency (n);
 }
 
 void
 Slur::set_default_dir()
 {
-    dir_i_ = -1;
-    for (int i=0; i < encompass_arr_.size(); i ++) {
-       if (encompass_arr_[i]->dir_i_ < 0) {
-           dir_i_ =1;
-           break;
+  dir_ = DOWN;
+  for (int i=0; i < encompass_arr_.size(); i ++) 
+    {
+      if (encompass_arr_[i]->dir_ < 0) 
+       {
+         dir_ =UP;
+         break;
        }
     }
 }
@@ -49,61 +49,61 @@ Slur::set_default_dir()
 void
 Slur::do_pre_processing()
 {
-    right_col_l_  = encompass_arr_.top()->pcol_l_;
-    left_col_l_ = encompass_arr_[0]->pcol_l_;    
+  set_bounds(LEFT, encompass_arr_[0]);    
+  set_bounds(RIGHT, encompass_arr_.top());
 }
 
-void
-Slur::do_break_at(PCol*l, PCol*r) 
-{
-    assert(l->line_l_ == r->line_l_);
-
-    Array<Note_column*> old_encompass_arr = encompass_arr_;
-    encompass_arr_.set_size(0);
-    for (int i =0; i < old_encompass_arr.size(); i++) {
-       if (old_encompass_arr[i]->pcol_l_->line_l_==l->line_l_)
-           encompass_arr_.push(old_encompass_arr[i]);
-    }
-}
 
 void
-Slur::do_substitute_dependency(Score_elem*o, Score_elem*n)
+Slur::do_substitute_dependency (Score_elem*o, Score_elem*n)
 {
-    int i;
-    while((i = encompass_arr_.find_i((Note_column*)o->item())) >=0) {
-       if (n)
-           encompass_arr_[i] = (Note_column*)n->item();
-       else
-           encompass_arr_.del(i);
+  int i;
+  while ((i = encompass_arr_.find_i ((Note_column*)o->item())) >=0) 
+    {
+      if (n)
+       encompass_arr_[i] = (Note_column*)n->item();
+      else
+       encompass_arr_.del (i);
     }
 }
 
 
 static int 
-Note_column_compare(Note_column *const&n1 , Note_column* const&n2)
+Note_column_compare (Note_column *const&n1 , Note_column* const&n2)
 {
-    return n1->pcol_l_->rank_i() - n2->pcol_l_->rank_i();
+  return Item::left_right_compare(n1, n2);
 }
 
 void
 Slur::do_post_processing()
 {
-    encompass_arr_.sort(Note_column_compare);
-    if (!dir_i_)
-       set_default_dir();
-    Real inter_f = paper()->internote_f();
-    
-    if (encompass_arr_[0]->stem_l_) 
-        left_pos_i_ = rint(encompass_arr_[0]->stem_l_->height()[dir_i_]/inter_f);
-    else 
-        left_pos_i_ = rint ( encompass_arr_[0]->head_positions_interval()[dir_i_]);
-    
-    if (encompass_arr_.top()->stem_l_)
-        right_pos_i_ = rint(encompass_arr_.top()->stem_l_->height()[dir_i_]/inter_f);
-    else 
-        right_pos_i_ = rint (encompass_arr_.top()->head_positions_interval()[dir_i_]);
-
-    left_pos_i_ += dir_i_;
-    right_pos_i_ += dir_i_;
+  encompass_arr_.sort (Note_column_compare);
+  if (!dir_)
+    set_default_dir();
+  Real inter_f = paper()->internote_f ();
+  
+  Drul_array<Note_column*> extrema;
+  extrema[LEFT] = encompass_arr_[0];
+  extrema[RIGHT] = encompass_arr_.top();
+
+  Direction d=LEFT;
+  Real nw_f = paper()->note_width ();
+  while ((d *= -1) != LEFT);
+  do 
+    {
+      if  (extrema[d] != spanned_drul_[d]) 
+       {
+         dx_f_drul_[d] = -d 
+           *(spanned_drul_[d]->width ().length ()/nw_f -0.5);
+       }
+      else if (extrema[d]->stem_l_ && !extrema[d]->stem_l_->transparent_b_) 
+       pos_i_drul_[d] = (int)rint (extrema[d]->stem_l_->height()[dir_]/inter_f);
+      else 
+       pos_i_drul_[d] = (int)rint (extrema[d]->head_positions_interval()[dir_]);
+      pos_i_drul_[d] += dir_;
+    }
+  while ((d *= -1) != LEFT);
 }
-IMPLEMENT_STATIC_NAME(Slur);
+
+IMPLEMENT_IS_TYPE_B1(Slur,Spanner);