]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/slur.cc
release: 1.5.44
[lilypond.git] / lily / slur.cc
index f72490f87207165ea5f84f2139e84085aa611ab5..427cd0799acaae8552d332d0478fac6d90a73228 100644 (file)
@@ -166,16 +166,16 @@ Slur::check_slope (Grob *me)
     }
 }
 
-void
+/*
+  Set 'attachment grob property, and return it.
+*/
+SCM
 Slur::set_extremities (Grob *me)
 {
   if (!Directional_element_interface::get (me))
     Directional_element_interface::set (me, get_default_dir (me));
 
-  Direction dir = LEFT;
-  do 
-    {
-      SCM att = me->get_grob_property ("attachment");
+  SCM att = me->get_grob_property ("attachment");
       /*
        */
       if (!gh_pair_p (att))
@@ -185,6 +185,10 @@ Slur::set_extremities (Grob *me)
          me->set_grob_property ("attachment", att);
        }
       
+  Direction dir = LEFT;
+  do 
+    {
+    
       if (!gh_symbol_p (index_cell (att, dir)))
        {
          for (SCM s = me->get_grob_property ("extremity-rules");
@@ -204,6 +208,8 @@ Slur::set_extremities (Grob *me)
   while (flip (&dir) != LEFT);
 
   check_slope (me);
+
+  return att;
 }
 
 
@@ -274,9 +280,9 @@ Slur::get_attachment (Grob *me, Direction dir,
   SCM s = me->get_grob_property ("attachment");
   if (!gh_symbol_p (index_cell (s, dir)))
     {
-      set_extremities (me);
-      s = me->get_grob_property ("attachment");
+      s = set_extremities (me);
     }
+  
   SCM a = dir == LEFT ? ly_car (s) : ly_cdr (s);
   Spanner*sp = dynamic_cast<Spanner*> (me);
   String str = ly_symbol2string (a);
@@ -284,6 +290,8 @@ Slur::get_attachment (Grob *me, Direction dir,
   Real hs = staff_space / 2.0;
   Offset o;
   
+  int slurdir = gh_scm2int (me->get_grob_property ("direction"));
+  
   Grob *stem = 0;
   if (Note_column::has_interface (sp->get_bound (dir)))
     {
@@ -323,8 +331,13 @@ Slur::get_attachment (Grob *me, Direction dir,
              /*
                Default position is on stem X, at stem end Y
               */
+             Real stem_thickness =
+               gh_scm2double (stem->get_grob_property ("thickness"))
+               * stem->paper_l ()->get_var ("stafflinethickness");
              o += Offset (0.5 *
-                          x_extent * (1 + Stem::get_direction (stem)),
+                          x_extent * (1 + Stem::get_direction (stem))
+                          - ((dir + 1)/2) * stem_thickness
+                          + ((1 - slurdir)/2) * stem_thickness,
                           0);
            }
        }
@@ -344,7 +357,6 @@ Slur::get_attachment (Grob *me, Direction dir,
 
   SCM alist = me->get_grob_property ("extremity-offset-alist");
   int stemdir = stem ? Stem::get_direction (stem) : 1;
-  int slurdir = gh_scm2int (me->get_grob_property ("direction"));
   SCM l = scm_assoc
     (scm_list_n (a,
                  gh_int2scm (stemdir * dir),
@@ -620,9 +632,14 @@ Slur::get_curve (Grob*me)
   Bezier b;
   int i = 0;
 
+  SCM attach = me->get_grob_property ("attachment");
+  if (!gh_pair_p (attach))
+    attach = set_extremities(me);
+
+  
   if (!Directional_element_interface::get (me)
-      || ! gh_symbol_p (index_cell (me->get_grob_property ("attachment"), LEFT))
-      || ! gh_symbol_p (index_cell (me->get_grob_property ("attachment"), RIGHT)))
+      || ! gh_symbol_p (index_cell (attach, LEFT))
+      || ! gh_symbol_p (index_cell (attach, RIGHT)))
     set_extremities (me);
   
   if (!gh_pair_p (me->get_grob_property ("control-points")))