From: Mike Solomon Date: Sat, 15 Oct 2011 09:47:37 +0000 (+0200) Subject: Fixes issue 307 (intersection between slurs and extra objects). X-Git-Tag: release/2.15.15-1~45 X-Git-Url: https://git.donarmstrong.com/?a=commitdiff_plain;h=f581e0199e1d303c18aa86650350b4678313a461;p=lilypond.git Fixes issue 307 (intersection between slurs and extra objects). Does this by increasing the slur region based on the height of the extremal extra encompass object plus a padding controled by encompass-object-range-overshoot. --- diff --git a/input/regression/slur-shift-region.ly b/input/regression/slur-shift-region.ly new file mode 100644 index 0000000000..a56339168d --- /dev/null +++ b/input/regression/slur-shift-region.ly @@ -0,0 +1,10 @@ +\version "2.15.12" + +\header { + texidoc = "A slur's shift region is automatically made +higher to accommodate extra encompass elements." +} + +\relative c' { + c'2( \times 2/3 { g4 e c) } +} diff --git a/lily/include/misc.hh b/lily/include/misc.hh index 0491b5b4a9..ce4f4c838b 100644 --- a/lily/include/misc.hh +++ b/lily/include/misc.hh @@ -53,6 +53,12 @@ linear_interpolate (Real x, Real x1, Real x2, Real y1, Real y2) + (x - x1) / (x2 - x1) * y2; } +inline Real +normalize (Real x, Real x1, Real x2) +{ + return (x - x1) / (x2 - x1); +} + Real directed_round (Real f, Direction d); Real peak_around (Real epsilon, Real threshold, Real x); diff --git a/lily/include/slur-score-parameters.hh b/lily/include/slur-score-parameters.hh index 866de050f4..a56b9018d8 100644 --- a/lily/include/slur-score-parameters.hh +++ b/lily/include/slur-score-parameters.hh @@ -45,6 +45,7 @@ struct Slur_score_parameters Real close_to_edge_length_; Real head_slur_distance_max_ratio_; Real head_slur_distance_factor_; + Real encompass_object_range_overshoot_; void fill (Grob *him); }; diff --git a/lily/slur-score-parameters.cc b/lily/slur-score-parameters.cc index fe0a7828e2..8d392ff1dc 100644 --- a/lily/slur-score-parameters.cc +++ b/lily/slur-score-parameters.cc @@ -76,4 +76,6 @@ Slur_score_parameters::fill (Grob *me) = get_detail (details, ly_symbol2scm ("edge-slope-exponent")); close_to_edge_length_ = get_detail (details, ly_symbol2scm ("close-to-edge-length")); -} + encompass_object_range_overshoot_ + = get_detail (details, ly_symbol2scm ("encompass-object-range-overshoot")); + } diff --git a/lily/slur-scoring.cc b/lily/slur-scoring.cc index 5413c047c2..d8c7655185 100644 --- a/lily/slur-scoring.cc +++ b/lily/slur-scoring.cc @@ -24,9 +24,11 @@ #include "accidental-interface.hh" #include "beam.hh" +#include "clef.hh" #include "directional-element-interface.hh" #include "libc-extension.hh" #include "main.hh" +#include "misc.hh" #include "note-column.hh" #include "output-def.hh" #include "paper-column.hh" @@ -38,6 +40,7 @@ #include "staff-symbol-referencer.hh" #include "staff-symbol.hh" #include "stem.hh" +#include "time-signature.hh" #include "warn.hh" /* @@ -262,15 +265,54 @@ Slur_score_state::fill (Grob *me) Drul_array end_ys = get_y_attachment_range (); + extra_encompass_infos_ = get_extra_encompass_infos (); + + Interval additional_ys (0.0,0.0); + + for (vsize i = 0; i < extra_encompass_infos_.size (); i++) + { + if (extra_encompass_infos_[i].extents_[X_AXIS].is_empty ()) + continue; + + Real y_place = linear_interpolate (extra_encompass_infos_[i].extents_[X_AXIS].center (), + base_attachments_[RIGHT][X_AXIS], + base_attachments_[LEFT][X_AXIS], + end_ys[RIGHT], + end_ys[LEFT]); + Real encompass_place = extra_encompass_infos_[i].extents_[Y_AXIS][dir_]; + if (extra_encompass_infos_[i].type_ == ly_symbol2scm ("inside") + && minmax (dir_, encompass_place, y_place) == encompass_place + && (!extra_encompass_infos_[i].grob_->internal_has_interface (ly_symbol2scm ("key-signature-interface")) + && !Clef::has_interface (extra_encompass_infos_[i].grob_) + && !Time_signature::has_interface (extra_encompass_infos_[i].grob_))) + { + Direction d = LEFT; + do + additional_ys[d] = minmax (dir_, + additional_ys[d], + (dir_ + * (parameters_.encompass_object_range_overshoot_ + + (y_place - encompass_place) + * (normalize (extra_encompass_infos_[i].extents_[X_AXIS].center (), + base_attachments_[RIGHT][X_AXIS], + base_attachments_[LEFT][X_AXIS]) + + (dir_ == LEFT ? 0 : -1))))); + while (flip (&d) != LEFT); + } + } + + Direction d = LEFT; + do + end_ys[d] += additional_ys[d]; + while (flip (&d) != LEFT); + configurations_ = enumerate_attachments (end_ys); for (vsize i = 0; i < columns_.size (); i++) encompass_infos_.push_back (get_encompass_info (columns_[i])); - extra_encompass_infos_ = get_extra_encompass_infos (); valid_ = true; musical_dy_ = 0.0; - Direction d = LEFT; do { if (!is_broken_ diff --git a/scm/layout-slur.scm b/scm/layout-slur.scm index 391582bdf6..d0ffe78e0f 100644 --- a/scm/layout-slur.scm +++ b/scm/layout-slur.scm @@ -37,4 +37,5 @@ (absolute-closeness-measure . 0.3) (edge-slope-exponent . 1.7) (close-to-edge-length . 2.5) + (encompass-object-range-overshoot . 0.5) ))