X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fslur-scoring.cc;h=543137dc486b368edea25cb69ac2eaf536512df8;hb=f166a6e3a57e6cff6dbaf97b2c47edc114c8ec2f;hp=5413c047c2cc219f71773a211aa426d0385d4198;hpb=f93e4199873c91ae32f0e84a610d14853dc379df;p=lilypond.git diff --git a/lily/slur-scoring.cc b/lily/slur-scoring.cc index 5413c047c2..543137dc48 100644 --- a/lily/slur-scoring.cc +++ b/lily/slur-scoring.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1996--2011 Han-Wen Nienhuys + Copyright (C) 1996--2012 Han-Wen Nienhuys Jan Nieuwenhuizen LilyPond is free software: you can redistribute it and/or modify @@ -24,9 +24,12 @@ #include "accidental-interface.hh" #include "beam.hh" +#include "clef.hh" #include "directional-element-interface.hh" +#include "dots.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 +41,7 @@ #include "staff-symbol-referencer.hh" #include "staff-symbol.hh" #include "stem.hh" +#include "time-signature.hh" #include "warn.hh" /* @@ -262,15 +266,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_ @@ -764,6 +807,8 @@ Slur_score_state::get_extra_encompass_infos () const Grob *g = encompasses [i]; Interval xe = g->extent (common_[X_AXIS], X_AXIS); Interval ye = g->extent (common_[Y_AXIS], Y_AXIS); + if (Dots::has_interface (g)) + ye.widen (0.2); Real xp = 0.0; Real penalty = parameters_.extra_object_collision_penalty_;