]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/slur.cc
release: 1.1.38
[lilypond.git] / lily / slur.cc
index 552c3837386baf459fa44c2de0897a65cbd769f9..ff5c72076282cc3e07f99f3654a327b821189a3c 100644 (file)
@@ -40,7 +40,7 @@ Slur::add_column (Note_column*n)
   if (!n->head_l_arr_.size ())
     warning (_ ("Putting slur over rest."));
   encompass_arr_.push (n);
-  n->stem_l_->slur_l_ = this;
+  //  n->stem_l_->slur_l_ = this;
   add_dependency (n);
 }
 
@@ -50,7 +50,7 @@ Slur::set_default_dir ()
   dir_ = DOWN;
   for (int i=0; i < encompass_arr_.size (); i ++) 
     {
-      if (encompass_arr_[i]->dir_ < 0) 
+      if (encompass_arr_[i]->dir () < 0) 
        {
          dir_ = UP;
          break;
@@ -73,7 +73,7 @@ Slur::do_pre_processing ()
 }
 
 void
-Slur::do_substitute_dependency (Score_element*o, Score_element*n)
+Slur::do_substitute_element_pointer (Score_element*o, Score_element*n)
 {
   int i;
   while ((i = encompass_arr_.find_i (dynamic_cast<Note_column *> (o))) >=0) 
@@ -91,6 +91,22 @@ Note_column_compare (Note_column *const&n1 , Note_column* const&n2)
   return Item::left_right_compare (n1, n2);
 }
 
+static bool
+broken_edge_b (Slur*s, Drul_array<Note_column*>& extrema, Direction dir)
+{
+  return extrema[dir] != s->spanned_drul_[dir];
+}
+
+static bool
+normal_edge_b (Slur*s, Drul_array<Note_column*>& extrema, Direction dir)
+{
+  Note_column *n = extrema[dir];
+  return !broken_edge_b (s, extrema, dir)
+    && n->stem_l_
+    && n->stem_l_->get_elt_property (transparent_scm_sym) == SCM_BOOL_F
+    && n->head_l_arr_.size ();
+}
+
 void
 Slur::do_post_processing ()
 {
@@ -98,10 +114,10 @@ Slur::do_post_processing ()
   if (!dir_)
     set_default_dir ();
 
-  Real interline_f = paper ()->interline_f ();
+  Real interline_f = paper_l ()->get_realvar (interline_scm_sym);
   Real internote_f = interline_f / 2;
   // URG
-  Real notewidth_f = paper ()->note_width () * 0.8;
+  Real notewidth_f = paper_l ()->note_width () * 0.8;
 
   /* 
    [OSU]: slur and tie placement
@@ -114,7 +130,7 @@ Slur::do_post_processing ()
      --> height <= 5 length ?? we use <= 3 length, now...
    */
   
-  Real gap_f = paper ()->get_var ("slur_x_gap");
+  Real gap_f = paper_l ()->get_var ("slur_x_gap");
 
   Drul_array<Note_column*> extrema;
   extrema[LEFT] = encompass_arr_[0];
@@ -122,16 +138,9 @@ Slur::do_post_processing ()
 
   Direction d=LEFT;
  
-#define BROKEN_SLUR_b(dir) \
-  (extrema[dir] != spanned_drul_[d])
-#define NORMAL_SLUR_b(dir) \
-  (extrema[dir]->stem_l_ \
-   && !extrema[dir]->stem_l_->transparent_b_  \
-   && extrema[dir]->head_l_arr_.size ()) 
-
   do 
     {
-      if (BROKEN_SLUR_b (d))
+      if (broken_edge_b (this, extrema, d))
        {
          // ugh -- check if needed
          dx_f_drul_[d] = -d 
@@ -141,7 +150,7 @@ Slur::do_post_processing ()
          if (d == RIGHT)
            {
              dx_f_drul_[LEFT] = spanned_drul_[LEFT]->extent (X_AXIS).length ();
-
+             
              // urg -- check if needed
              if (encompass_arr_.size () > 1)
                dx_f_drul_[RIGHT] += notewidth_f;
@@ -150,7 +159,7 @@ Slur::do_post_processing ()
       /*
         normal slur
        */
-      else if (NORMAL_SLUR_b (d))
+      else if (normal_edge_b (this, extrema, d))
         {
          Real notewidth_f = extrema[d]->extent (X_AXIS).length ();
          dy_f_drul_[d] = (int)rint (extrema[d]->stem_l_-> extent (Y_AXIS)[dir_]);
@@ -179,7 +188,7 @@ Slur::do_post_processing ()
   // now that both are set, do dependent
   do 
     {
-      if (BROKEN_SLUR_b (d))
+      if (broken_edge_b (this, extrema, d))
         {
          Direction u = d;
          flip(&u);
@@ -196,8 +205,8 @@ Slur::do_post_processing ()
   /*
     Slur should follow line of music
    */
-  if (!BROKEN_SLUR_b (LEFT) && !BROKEN_SLUR_b (RIGHT)
-      && NORMAL_SLUR_b (LEFT) && NORMAL_SLUR_b (RIGHT)
+  if (normal_edge_b (this, extrema, LEFT)
+      && normal_edge_b (this, extrema, RIGHT)
       && (extrema[LEFT]->stem_l_ != extrema[RIGHT]->stem_l_))
     {
       Real note_dy = extrema[RIGHT]->stem_l_->head_positions ()[dir_]
@@ -210,7 +219,7 @@ Slur::do_post_processing ()
       */
       if (sign (dy) != sign (note_dy))
        {
-         Real damp_f = paper ()->get_var ("slur_slope_follow_music_factor");
+         Real damp_f = paper_l ()->get_var ("slur_slope_follow_music_factor");
          Real realdy = note_dy * damp_f;
          Direction adjust_dir = (Direction)(- dir_ * sign (realdy));
          if (!adjust_dir)
@@ -235,7 +244,7 @@ Slur::do_post_processing ()
   /*
     Avoid too steep slurs.
    */
-  Real damp_f = paper ()->get_var ("slur_slope_damping");
+  Real damp_f = paper_l ()->get_var ("slur_slope_damping");
   Offset d_off = Offset (dx_f_drul_[RIGHT] - dx_f_drul_[LEFT],
     dy_f_drul_[RIGHT] - dy_f_drul_[LEFT]);
   d_off[X_AXIS] += extent (X_AXIS).length ();
@@ -249,12 +258,12 @@ Slur::do_post_processing ()
 Array<Offset>
 Slur::get_encompass_offset_arr () const
 {
-  Real notewidth = paper ()->note_width () * 0.8;
-  Real gap = paper ()->get_var ("slur_x_gap");
-  Real internote = paper ()->internote_f ();
+  Real notewidth = paper_l ()->note_width () * 0.8;
+  Real gap = paper_l ()->get_var ("slur_x_gap");
 
   Offset left = Offset (dx_f_drul_[LEFT], dy_f_drul_[LEFT]);
   left[X_AXIS] += encompass_arr_[0]->stem_l_->hpos_f ();
+  Real internote = encompass_arr_[0]->stem_l_->staff_line_leading_f ()/2.0;
 
   /*
     <URG>
@@ -299,23 +308,19 @@ Slur::get_encompass_offset_arr () const
 
   for (int i = first; i < last; i++)
     {
-      Encompass_info info (encompass_arr_[i], dir_);
+      Encompass_info info (encompass_arr_[i], dir_, this);
       notes.push (info.o_ - left);
     }
-  Encompass_info info (encompass_arr_.top (), dir_);
-  // [encompass_arr_.size () - 1]
-  
-  // urg:
-  Slur* urg = (Slur*)this;
-  urg->interstaff_f_ = info.interstaff_f_;
+  Encompass_info info (encompass_arr_.top (), dir_, this);
+  Real inter_staff = info.interstaff_f_;
   
-  d[Y_AXIS] += interstaff_f_;
+  d[Y_AXIS] += inter_staff;
 
   // prebreak
-  if (interstaff_f_ && (encompass_arr_.top () != spanned_drul_[RIGHT]))
+  if (inter_staff && (encompass_arr_.top () != spanned_drul_[RIGHT]))
     {
-      Encompass_info info (encompass_arr_[encompass_arr_.size () - 1], dir_);
-      d[Y_AXIS] -= info.o_[Y_AXIS] - interstaff_f_;
+      Encompass_info info (encompass_arr_[encompass_arr_.size () - 1], dir_, this);
+      d[Y_AXIS] -= info.o_[Y_AXIS] - inter_staff;
     }
 
   notes.push (d);
@@ -330,7 +335,7 @@ Slur::get_rods () const
   Array<Rod> a;
   Rod r;
   r.item_l_drul_ = spanned_drul_;
-  r.distance_f_ = paper ()->get_var ("slur_x_minimum");
+  r.distance_f_ = paper_l ()->get_var ("slur_x_minimum");
 
   a.push (r);
   return a;