]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/break-alignment-interface.cc
Fix 97.
[lilypond.git] / lily / break-alignment-interface.cc
index 4a2ab62cb73868a083a66170198ad339a953bb84..7e866a551ffcc4bc7b6ad0892ea95bb7ca254f0b 100644 (file)
@@ -296,10 +296,36 @@ Break_alignable_interface::self_align_callback (SCM grob)
   else
     which_edge = RIGHT;
   
-  Grob *common = me->common_refpoint (elements[last_idx_found], X_AXIS);
+  Grob *alignment_parent = elements[last_idx_found];
+  Grob *common = me->common_refpoint (alignment_parent, X_AXIS);
+  Real anchor = robust_scm2double (alignment_parent->get_property ("break-align-anchor"), 0);
 
-  return scm_from_double (robust_relative_extent (elements[last_idx_found], common, X_AXIS)[which_edge]
-                         - me->relative_coordinate (common, X_AXIS));
+  return scm_from_double (alignment_parent->relative_coordinate (common, X_AXIS)
+                         - me->relative_coordinate (common, X_AXIS)
+                         + anchor);
+}
+
+MAKE_SCHEME_CALLBACK (Break_aligned_interface, calc_anchor, 1)
+SCM
+Break_aligned_interface::calc_anchor (SCM grob)
+{
+  Grob *me = unsmob_grob (grob);
+  Real avg = 0.0;
+  int count = 0;
+
+  /* average the anchors of those children that have it set */
+  extract_grob_set (me, "elements", elts);
+  for (vsize i = 0; i < elts.size (); i++)
+    {
+      SCM anchor = elts[i]->get_property ("break-align-anchor");
+      if (scm_is_number (anchor))
+       {
+         count++;
+         avg += scm_to_double (anchor);
+       }
+    }
+
+  return scm_from_double (count > 0 ? avg / count : 0);
 }
 
 ADD_INTERFACE (Break_alignable_interface,
@@ -336,6 +362,7 @@ ADD_INTERFACE (Break_aligned_interface,
               "See [Wanske] page 126 -- 134, [Ross] pg 143 -- 147\n",
 
               /* properties */ 
+              "break-align-anchor "
               "break-align-symbol "
               "space-alist "
               );