]> git.donarmstrong.com Git - lilypond.git/commitdiff
Better fix for the end-position of a line spanner.
authorJoe Neeman <joeneeman@gmail.com>
Tue, 13 Feb 2007 08:12:06 +0000 (10:12 +0200)
committerJoe Neeman <joeneeman@gmail.com>
Tue, 13 Feb 2007 08:12:06 +0000 (10:12 +0200)
lily/line-spanner.cc

index 4e75d0382a1d19e487923cac5e4466326f89a398..3d5638343f9799c5595a1bbcd70226c4bd17b1c0 100644 (file)
@@ -6,6 +6,7 @@
   (c) 2000--2007 Jan Nieuwenhuizen <janneke@gnu.org>
 */
 
+#include "axis-group-interface.hh"
 #include "spanner.hh"
 #include "output-def.hh"
 #include "item.hh"
@@ -15,6 +16,7 @@
 #include "align-interface.hh"
 #include "line-interface.hh"
 #include "moment.hh"
+#include "system.hh"
 
 #include "lily-proto.hh"
 #include "grob-interface.hh"
@@ -32,6 +34,13 @@ public:
   DECLARE_GROB_INTERFACE ();
 };
 
+Spanner *parent_spanner (Grob *g)
+{
+  if (Spanner::has_interface (g))
+    return dynamic_cast<Spanner*> (g);
+  return parent_spanner (g->get_parent (Y_AXIS));
+}
+
 SCM
 Line_spanner::calc_bound_info (SCM smob, Direction dir)
 {
@@ -107,19 +116,34 @@ Line_spanner::calc_bound_info (SCM smob, Direction dir)
              return SCM_EOL;
            }
 
-         Grob *next_common_y = next_sp->common_refpoint (next_bound, X_AXIS);
-         Interval next_ext = next_bound->extent (next_common_y, Y_AXIS);
-
-         /* FIXME: this is not a real solution. We want to know would be the
-            y-position of the right bound (relative to the line-spanner)
-            if it belonged to the same system
-            as the left bound. What we do instead is to calculate the
-            y-position of the right bound relative to the VerticalAlignment
-            (of the next System!) and subtract the y-position of the
-            line-spanner relative to the VerticalAlignment (of this System!).
-            This works as long as the distance between staves is approximately
-            the same before and after breaking. */
-         y = next_ext.center () - me->relative_coordinate (common_y, Y_AXIS);
+         Spanner *next_bound_parent = parent_spanner (next_bound);
+         Interval next_ext = next_bound->extent (next_bound_parent, Y_AXIS);
+
+         /* We want to know what would be the
+            y-position of the next bound (relative to my y-parent) if it belonged
+            to the same system as this bound. We rely on the fact that
+            the y-parent of the next bound is a spanner (probably the
+            VerticalAxisGroup of a staff) that extends over the break.
+         */
+         Spanner *next_bound_parent_on_this_line =
+           next_bound_parent->broken_neighbor (other_dir (dir));
+
+         if (next_bound_parent_on_this_line)
+           {
+             Grob *common = me->common_refpoint (next_bound_parent_on_this_line, Y_AXIS);
+             Real bound_offset = next_bound_parent_on_this_line->relative_coordinate (common, Y_AXIS);
+             y = next_ext.center () + bound_offset - me->relative_coordinate (common, Y_AXIS);
+           }
+         else
+           {
+             /* We fall back to assuming that the distance between staves doesn't
+                change over line breaks. */
+             programming_error ("next-bound's parent doesn't extend to this line");
+             Grob *next_system = next_bound->get_system ();
+             Grob *this_system = me->get_system ();
+             y = next_ext.center () + next_bound_parent->relative_coordinate (next_system, Y_AXIS)
+               - me->relative_coordinate (this_system, Y_AXIS);
+           }
        }
       else
        {