From 65c759c2219fb8465fc262206e955a76775da318 Mon Sep 17 00:00:00 2001 From: Joe Neeman Date: Tue, 13 Feb 2007 10:12:06 +0200 Subject: [PATCH] Better fix for the end-position of a line spanner. --- lily/line-spanner.cc | 50 ++++++++++++++++++++++++++++++++------------ 1 file changed, 37 insertions(+), 13 deletions(-) diff --git a/lily/line-spanner.cc b/lily/line-spanner.cc index 4e75d0382a..3d5638343f 100644 --- a/lily/line-spanner.cc +++ b/lily/line-spanner.cc @@ -6,6 +6,7 @@ (c) 2000--2007 Jan Nieuwenhuizen */ +#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 (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 { -- 2.39.2