From: Joe Neeman Date: Tue, 28 Aug 2007 21:51:59 +0000 (+1000) Subject: Fix 426. X-Git-Tag: release/2.11.31-1~7^2~1 X-Git-Url: https://git.donarmstrong.com/?a=commitdiff_plain;h=c4cfedc7e988cc56d6390881288ae8c1a7e333c3;p=lilypond.git Fix 426. Ensure that ties only consider grobs in a NonMusicalColumn if those grobs belong to the same staff as the ties. --- diff --git a/lily/axis-group-interface.cc b/lily/axis-group-interface.cc index 9590432746..b589ff671e 100644 --- a/lily/axis-group-interface.cc +++ b/lily/axis-group-interface.cc @@ -323,6 +323,22 @@ Axis_group_interface::generic_group_extent (Grob *me, Axis a) return ly_interval2scm (r - my_coord); } +/* This is like generic_group_extent, but it only counts the grobs that + are children of some other axis-group. This is uncached; if it becomes + commonly used, it may be necessary to cache it somehow. */ +Interval +Axis_group_interface::staff_extent (Grob *me, Grob *refp, Axis ext_a, Grob *staff, Axis parent_a) +{ + extract_grob_set (me, "elements", elts); + vector new_elts; + + for (vsize i = 0; i < elts.size (); i++) + if (elts[i]->common_refpoint (staff, parent_a) == staff) + new_elts.push_back (elts[i]); + + return relative_group_extent (new_elts, refp, ext_a); +} + Grob * Axis_group_interface::calc_pure_elts_and_common (Grob *me) diff --git a/lily/include/axis-group-interface.hh b/lily/include/axis-group-interface.hh index c9b1a58eb0..95c4901f34 100644 --- a/lily/include/axis-group-interface.hh +++ b/lily/include/axis-group-interface.hh @@ -39,6 +39,7 @@ struct Axis_group_interface static void set_axes (Grob *, Axis, Axis); static bool has_axis (Grob *, Axis); static void get_children (Grob *, vector *); + static Interval staff_extent (Grob *me, Grob *ref, Axis, Grob *staff, Axis); DECLARE_GROB_INTERFACE(); }; diff --git a/lily/include/tie-formatting-problem.hh b/lily/include/tie-formatting-problem.hh index cb7d8c6e16..69b49322b0 100644 --- a/lily/include/tie-formatting-problem.hh +++ b/lily/include/tie-formatting-problem.hh @@ -47,6 +47,7 @@ class Tie_formatting_problem Tie_configuration_map possibilities_; Grob *x_refpoint_; + Grob *y_refpoint_; Tie_configuration *get_configuration (int position, Direction dir, Drul_array cols, bool tune_y) const; diff --git a/lily/tie-formatting-problem.cc b/lily/tie-formatting-problem.cc index 51bee1b6cf..c9e2e30fbb 100644 --- a/lily/tie-formatting-problem.cc +++ b/lily/tie-formatting-problem.cc @@ -9,6 +9,7 @@ #include "tie-formatting-problem.hh" +#include "axis-group-interface.hh" #include "paper-column.hh" #include "bezier.hh" #include "directional-element-interface.hh" @@ -61,6 +62,7 @@ Tie_formatting_problem::get_attachment (Real y, Drul_array columns) const Tie_formatting_problem::Tie_formatting_problem () { x_refpoint_ = 0; + y_refpoint_ = 0; use_horizontal_spacing_ = true; } @@ -231,9 +233,11 @@ Tie_formatting_problem::set_column_chord_outline (vector bounds, chord_outlines_[key] = Skyline (boxes, details_.skyline_padding_, Y_AXIS, -dir); if (bounds[0]->break_status_dir ()) { - Real x = robust_relative_extent (bounds[0], x_refpoint_, X_AXIS)[-dir]; - - chord_outlines_[key].set_minimum_height (x); + Interval iv (Axis_group_interface::staff_extent (bounds[0], x_refpoint_, X_AXIS, y_refpoint_, Y_AXIS)); + if (iv.is_empty ()) + iv.add_point (bounds[0]->relative_coordinate (x_refpoint_, X_AXIS)); + + chord_outlines_[key].set_minimum_height (iv[-dir]); } else { @@ -303,10 +307,20 @@ Tie_formatting_problem::from_ties (vector const &ties) return; x_refpoint_ = ties[0]; + y_refpoint_ = ties[0]; for (vsize i = 0; i < ties.size (); i++) { - x_refpoint_ = dynamic_cast (ties[i])->get_bound (LEFT)->common_refpoint (x_refpoint_, X_AXIS); - x_refpoint_ = dynamic_cast (ties[i])->get_bound (RIGHT)->common_refpoint (x_refpoint_, X_AXIS); + Spanner *tie = dynamic_cast (ties[i]); + Item *l = tie->get_bound (LEFT); + Item *r = tie->get_bound (RIGHT); + + x_refpoint_ = l->common_refpoint (x_refpoint_, X_AXIS); + x_refpoint_ = r->common_refpoint (x_refpoint_, X_AXIS); + + if (!l->break_status_dir ()) + y_refpoint_ = l->common_refpoint (y_refpoint_, Y_AXIS); + if (!r->break_status_dir ()) + y_refpoint_ = r->common_refpoint (y_refpoint_, Y_AXIS); } details_.from_grob (ties[0]); @@ -378,11 +392,19 @@ Tie_formatting_problem::from_semi_ties (vector const &semi_ties, Directio specifications_.push_back (spec); } - x_refpoint_ = semi_ties [0]; + x_refpoint_ = semi_ties[0]; + y_refpoint_ = semi_ties[0]; + for (vsize i = 0; i < semi_ties.size (); i++) - x_refpoint_ = semi_ties[i]->common_refpoint (x_refpoint_, X_AXIS); + { + x_refpoint_ = semi_ties[i]->common_refpoint (x_refpoint_, X_AXIS); + y_refpoint_ = semi_ties[i]->common_refpoint (y_refpoint_, Y_AXIS); + } for (vsize i = 0; i < heads.size (); i++) - x_refpoint_ = heads[i]->common_refpoint (x_refpoint_, X_AXIS); + { + x_refpoint_ = heads[i]->common_refpoint (x_refpoint_, X_AXIS); + y_refpoint_ = heads[i]->common_refpoint (y_refpoint_, Y_AXIS) ; + } set_chord_outline (heads, head_dir);