From ba43faee242b37c23732aefb9fbce7eeb6d2eb25 Mon Sep 17 00:00:00 2001 From: Han-Wen Nienhuys Date: Wed, 1 Jun 2005 15:04:57 +0000 Subject: [PATCH] * lily/slur-scoring.cc (generate_avoid_offsets): new function. Generate avoid offsets once per slur. * lily/slur.cc (add_extra_encompass): add dependency to extra-encompass object. This fixes bugs/c-phrasing-slur.ly * scripts/lilypond-book.py (do_options): --psfonts doesn't take argument anymore. * scripts/lilypond-book.py (set_default_options): new function. Call this before dissecting snippets, so linewidth settings reach the snippets. --- ChangeLog | 6 +++ lily/include/slur-configuration.hh | 3 +- lily/include/slur-scoring.hh | 1 + lily/slur-configuration.cc | 35 ++----------- lily/slur-scoring.cc | 81 ++++++++++++++++++++++++------ lily/slur.cc | 1 + scripts/lilypond-book.py | 1 + 7 files changed, 79 insertions(+), 49 deletions(-) diff --git a/ChangeLog b/ChangeLog index d39623b8ec..339f6ec8a7 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,11 @@ 2005-06-01 Han-Wen Nienhuys + * lily/slur-scoring.cc (generate_avoid_offsets): new + function. Generate avoid offsets once per slur. + + * lily/slur.cc (add_extra_encompass): add dependency to + extra-encompass object. This fixes bugs/c-phrasing-slur.ly + * lily/stencil.cc (is_empty): check dim_ field for is_empty() too. Fixes inf error with added bass notes. diff --git a/lily/include/slur-configuration.hh b/lily/include/slur-configuration.hh index 81854868bb..23e67bceda 100644 --- a/lily/include/slur-configuration.hh +++ b/lily/include/slur-configuration.hh @@ -29,7 +29,8 @@ public: Slur_configuration (); - void generate_curve (Slur_score_state const &state, Real r0, Real h_inf); + void generate_curve (Slur_score_state const &state, Real r0, Real h_inf, + Array const&); void score (Slur_score_state const &); protected: void score_extra_encompass (Slur_score_state const &); diff --git a/lily/include/slur-scoring.hh b/lily/include/slur-scoring.hh index 5b4634115e..9e85ee857d 100644 --- a/lily/include/slur-scoring.hh +++ b/lily/include/slur-scoring.hh @@ -133,6 +133,7 @@ struct Slur_score_state void fill (Grob *); void set_next_direction (); + Array Slur_score_state::generate_avoid_offsets () const; Drul_array get_bound_info () const; void generate_curves () const; Link_array enumerate_attachments (Drul_array end_ys) const; diff --git a/lily/slur-configuration.cc b/lily/slur-configuration.cc index d1c337eb27..991e8d2658 100644 --- a/lily/slur-configuration.cc +++ b/lily/slur-configuration.cc @@ -96,39 +96,10 @@ fit_factor (Offset dz_unit, Offset dz_perp, void Slur_configuration::generate_curve (Slur_score_state const &state, - Real r_0, Real h_inf) + Real r_0, Real h_inf, + Array const &avoid + ) { - Link_array encompasses = state.columns_; - - Array avoid; - for (int i = 0; i < encompasses.size (); i++) - { - if (state.extremes_[LEFT].note_column_ == encompasses[i] - || state.extremes_[RIGHT].note_column_ == encompasses[i]) - continue; - - Encompass_info inf (state.get_encompass_info (encompasses[i])); - Real y = state.dir_ * (max (state.dir_ * inf.head_, state.dir_ * inf.stem_)); - - avoid.push (Offset (inf.x_, y + state.dir_ * state.parameters_.free_head_distance_)); - } - - Link_array extra_encompasses - = extract_grob_array (state.slur_, ly_symbol2scm ("encompass-objects")); - for (int i = 0; i < extra_encompasses.size (); i++) - if (Slur::has_interface (extra_encompasses[i])) - { - Grob *small_slur = extra_encompasses[i]; - Bezier b = Slur::get_curve (small_slur); - - Offset z = b.curve_point (0.5); - z += Offset (small_slur->relative_coordinate (state.common_[X_AXIS], X_AXIS), - small_slur->relative_coordinate (state.common_[Y_AXIS], Y_AXIS)); - - z[Y_AXIS] += state.dir_ * state.parameters_.free_slur_distance_; - avoid.push (z); - } - Offset dz = attachment_[RIGHT]- attachment_[LEFT];; Offset dz_unit = dz; dz_unit *= 1 / dz.length (); diff --git a/lily/slur-scoring.cc b/lily/slur-scoring.cc index ab945250b6..7239ba9289 100644 --- a/lily/slur-scoring.cc +++ b/lily/slur-scoring.cc @@ -398,29 +398,37 @@ set_slur_control_points (Grob *me) Bezier Slur_score_state::get_best_curve () { - for (int i = 0; i < configurations_.size (); i++) - { - configurations_[i]->score (*this); - } - - Real opt = 1e6; int opt_idx = -1; - for (int i = 0; i < configurations_.size (); i++) - { - if (configurations_[i]->score_ < opt) - { - opt = configurations_[i]->score_; - opt_idx = i; - } - } + Real opt = 1e6; #if DEBUG_SLUR_SCORING SCM inspect_quants = slur_->get_property ("inspect-quants"); if (to_boolean (slur_->get_layout () ->lookup_variable (ly_symbol2scm ("debug-slur-scoring"))) && scm_is_pair (inspect_quants)) - opt_idx = get_closest_index (inspect_quants); + { + opt_idx = get_closest_index (inspect_quants); + configurations_[opt_idx]->score (*this); + opt = configurations_[opt_idx]->score_; + } + else +#endif + { + for (int i = 0; i < configurations_.size (); i++) + { + configurations_[i]->score (*this); + } + for (int i = 0; i < configurations_.size (); i++) + { + if (configurations_[i]->score_ < opt) + { + opt = configurations_[i]->score_; + opt_idx = i; + } + } + } +#if DEBUG_SLUR_SCORING configurations_[opt_idx]->score_card_ += to_string ("=%.2f", opt); configurations_[opt_idx]->score_card_ += to_string ("i%d", opt_idx); @@ -616,13 +624,54 @@ Slur_score_state::move_away_from_staffline (Real y, return y; } + + +Array +Slur_score_state::generate_avoid_offsets () const +{ + Array avoid; + Link_array encompasses = columns_; + + for (int i = 0; i < encompasses.size (); i++) + { + if (extremes_[LEFT].note_column_ == encompasses[i] + || extremes_[RIGHT].note_column_ == encompasses[i]) + continue; + + Encompass_info inf (get_encompass_info (encompasses[i])); + Real y = dir_ * (max (dir_ * inf.head_, dir_ * inf.stem_)); + + avoid.push (Offset (inf.x_, y + dir_ * parameters_.free_head_distance_)); + } + + Link_array extra_encompasses + = extract_grob_array (slur_, ly_symbol2scm ("encompass-objects")); + for (int i = 0; i < extra_encompasses.size (); i++) + if (Slur::has_interface (extra_encompasses[i])) + { + Grob *small_slur = extra_encompasses[i]; + Bezier b = Slur::get_curve (small_slur); + + Offset z = b.curve_point (0.5); + z += Offset (small_slur->relative_coordinate (common_[X_AXIS], X_AXIS), + small_slur->relative_coordinate (common_[Y_AXIS], Y_AXIS)); + + z[Y_AXIS] += dir_ * parameters_.free_slur_distance_; + avoid.push (z); + } + + return avoid; +} + void Slur_score_state::generate_curves () const { Real r_0 = robust_scm2double (slur_->get_property ("ratio"), 0.33); Real h_inf = staff_space_ * scm_to_double (slur_->get_property ("height-limit")); + + Array avoid = generate_avoid_offsets (); for (int i = 0; i < configurations_.size (); i++) - configurations_[i]->generate_curve (*this, r_0, h_inf); + configurations_[i]->generate_curve (*this, r_0, h_inf, avoid); } Link_array diff --git a/lily/slur.cc b/lily/slur.cc index 060334d365..c4acdd1694 100644 --- a/lily/slur.cc +++ b/lily/slur.cc @@ -119,6 +119,7 @@ void Slur::add_extra_encompass (Grob *me, Grob *n) { Pointer_group_interface::add_grob (me, ly_symbol2scm ("encompass-objects"), n); + me->add_dependency (n); } MAKE_SCHEME_CALLBACK (Slur, outside_slur_callback, 2); diff --git a/scripts/lilypond-book.py b/scripts/lilypond-book.py index 1c17298915..193c94bd84 100644 --- a/scripts/lilypond-book.py +++ b/scripts/lilypond-book.py @@ -1554,6 +1554,7 @@ def main (): file = files[0] basename = os.path.splitext (file)[0] + basename = os.path.split (basename)[1] global process_cmd, format if not format: -- 2.39.5