X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Ftie-formatting-problem.cc;h=c9e2e30fbbbce5e5ee6622ce68eafc4fcb9013c4;hb=4d0242b14ba5744f36411f91d96a338b2d86fd38;hp=3105d784f1615a8e9ec459bfeb99289fa6bb3e1c;hpb=52c47ff08943021305e5d40bf5a4963e3e520af8;p=lilypond.git diff --git a/lily/tie-formatting-problem.cc b/lily/tie-formatting-problem.cc index 3105d784f1..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; } @@ -171,6 +173,7 @@ Tie_formatting_problem::set_column_chord_outline (vector bounds, Real x_center = head->extent (x_refpoint_, X_AXIS).center (); Interval x_ext; x_ext[-dir] = x_center; + x_ext[dir] = infinity_f * dir; Interval y_ext; for (vsize j = 0; j < head_boxes.size (); j++) y_ext.unite (head_boxes[j][Y_AXIS]); @@ -193,6 +196,9 @@ Tie_formatting_problem::set_column_chord_outline (vector bounds, } Grob *acc = unsmob_grob (heads[i]->get_object ("accidental-grob")); + if (acc) + acc->get_property ("stencil"); /* trigger tie-related suicide */ + if (acc && acc->is_live () && dir == RIGHT) { boxes.push_back (Box (acc->extent (x_refpoint_, X_AXIS), @@ -227,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 { @@ -299,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]); @@ -316,18 +334,9 @@ Tie_formatting_problem::from_ties (vector const &ties) { Item *it = dynamic_cast (ties[i])->get_bound (d); if (it->break_status_dir ()) - { - Item *sep - = dynamic_cast (unsmob_grob (ties[i]->get_object ("separation-item"))); - if (sep && sep->get_column () == it->get_column ()) - it = sep; + it = it->get_column (); - bounds.push_back (it); - } - else - { - bounds.push_back (it); - } + bounds.push_back (it); } set_chord_outline (bounds, d); @@ -383,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);