X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fslur-scoring.cc;h=618786867efff0fc4352addff0882cc1607e1d12;hb=5f2ab1daf560216392b065bf2e9042b8a9e7ec76;hp=57fa3c6183e4a938c83921cc5b3c3ec9050abbf5;hpb=75eebcb49e52d296b1da3e1074e0825d2c780db4;p=lilypond.git diff --git a/lily/slur-scoring.cc b/lily/slur-scoring.cc index 57fa3c6183..618786867e 100644 --- a/lily/slur-scoring.cc +++ b/lily/slur-scoring.cc @@ -9,22 +9,24 @@ #include "slur-scoring.hh" -#include "libc-extension.hh" -#include "slur-configuration.hh" + +#include "accidental-interface.hh" #include "beam.hh" #include "directional-element-interface.hh" -#include "pointer-group-interface.hh" -#include "slur.hh" +#include "libc-extension.hh" +#include "main.hh" #include "note-column.hh" #include "output-def.hh" +#include "paper-column.hh" #include "pitch.hh" +#include "pointer-group-interface.hh" +#include "slur-configuration.hh" +#include "slur.hh" #include "spanner.hh" #include "staff-symbol-referencer.hh" #include "staff-symbol.hh" #include "stem.hh" #include "warn.hh" -#include "paper-column.hh" -#include "accidental-interface.hh" /* TODO: @@ -64,61 +66,6 @@ Slur_score_state::~Slur_score_state () junk_pointers (configurations_); } -Real -get_detail (SCM alist, SCM sym) -{ - SCM entry = scm_assq (sym, alist); - return robust_scm2double (scm_is_pair (entry) - ? scm_cdr (entry) - : SCM_EOL, - 0.0); -} - -void -Slur_score_parameters::fill (Grob *me) -{ - SCM details = me->get_property ("details"); - - region_size_ - = (int) get_detail (details, ly_symbol2scm ("region-size")); - head_encompass_penalty_ - = get_detail (details, ly_symbol2scm ("head-encompass-penalty")); - stem_encompass_penalty_ - = get_detail (details, ly_symbol2scm ("stem-encompass-penalty")); - closeness_factor_ - = get_detail (details, ly_symbol2scm ("closeness-factor")); - edge_attraction_factor_ - = get_detail (details, ly_symbol2scm ("edge-attraction-factor")); - same_slope_penalty_ - = get_detail (details, ly_symbol2scm ("same-slope-penalty")); - steeper_slope_factor_ - = get_detail (details, ly_symbol2scm ("steeper-slope-factor")); - non_horizontal_penalty_ - = get_detail (details, ly_symbol2scm ("non-horizontal-penalty")); - max_slope_ - = get_detail (details, ly_symbol2scm ("max-slope")); - max_slope_factor_ - = get_detail (details, ly_symbol2scm ("max-slope-factor")); - free_head_distance_ - = get_detail (details, ly_symbol2scm ("free-head-distance")); - absolute_closeness_measure_ - = get_detail (details, ly_symbol2scm ("absolute-closeness-measure")); - extra_object_collision_penalty_ - = get_detail (details, ly_symbol2scm ("extra-object-collision-penalty")); - accidental_collision_ - = get_detail (details, ly_symbol2scm ("accidental-collision")); - extra_encompass_free_distance_ - = get_detail (details, ly_symbol2scm ("extra-encompass-free-distance")); - head_slur_distance_factor_ - = get_detail (details, ly_symbol2scm ("head-slur-distance-factor")); - head_slur_distance_max_ratio_ - = get_detail (details, ly_symbol2scm ("head-slur-distance-max-ratio")); - free_slur_distance_ - = get_detail (details, ly_symbol2scm ("free-slur-distance")); - edge_slope_exponent_ - = get_detail (details, ly_symbol2scm ("edge-slope-exponent")); -} - Real broken_trend_y (Slur_score_state const &state, Direction hdir) { @@ -127,9 +74,9 @@ broken_trend_y (Slur_score_state const &state, Direction hdir) Real by = 0.0; if (Spanner *mother = dynamic_cast (state.slur_->original ())) { - int k = broken_spanner_index (state.slur_); - int j = k + hdir; - if (j < 0 || j >= mother->broken_intos_.size ()) + vsize k = broken_spanner_index (state.slur_); + int j = int (k) + hdir; + if (j < 0 || vsize (j) >= mother->broken_intos_.size ()) return by; Grob *neighbor = mother->broken_intos_[j]; @@ -139,7 +86,7 @@ broken_trend_y (Slur_score_state const &state, Direction hdir) = broken_spanner_index (dynamic_cast (state.common_[Y_AXIS])); int common_j = common_k + hdir; - if (common_j < 0 || common_j >= common_mother->broken_intos_.size ()) + if (common_j < 0 || vsize (common_j) >= common_mother->broken_intos_.size ()) return by; Grob *common_next_system = common_mother->broken_intos_[common_j]; @@ -163,9 +110,8 @@ Slur_score_state::set_next_direction () if (Spanner *mother = dynamic_cast (slur_->original ())) { - int k = broken_spanner_index (slur_); - int j = k + 1; - if (j < 0 || j >= mother->broken_intos_.size ()) + vsize j = 1 + broken_spanner_index (slur_); + if (j >= mother->broken_intos_.size ()) return; Grob *neighbor = mother->broken_intos_[j]; @@ -285,14 +231,14 @@ Slur_score_state::fill (Grob *me) columns_ = internal_extract_grob_array (me, ly_symbol2scm ("note-columns")); - if (columns_.is_empty ()) + if (columns_.empty ()) { me->suicide (); return; } staff_space_ = Staff_symbol_referencer::staff_space (me); - Real lt = me->layout ()->get_dimension (ly_symbol2scm ("linethickness")); + Real lt = me->layout ()->get_dimension (ly_symbol2scm ("line-thickness")); thickness_ = robust_scm2double (me->get_property ("thickness"), 1.0) * lt; dir_ = get_grob_direction (me); @@ -336,8 +282,8 @@ Slur_score_state::fill (Grob *me) = get_y_attachment_range (); configurations_ = enumerate_attachments (end_ys); - for (int i = 0; i < columns_.size (); i++) - encompass_infos_.push (get_encompass_info (columns_[i])); + 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; @@ -405,43 +351,84 @@ Slur_score_state::get_best_curve () Real opt = 1e6; #if DEBUG_SLUR_SCORING + bool debug_slurs = to_boolean (slur_->layout () + ->lookup_variable (ly_symbol2scm ("debug-slur-scoring"))); SCM inspect_quants = slur_->get_property ("inspect-quants"); - if (to_boolean (slur_->layout () - ->lookup_variable (ly_symbol2scm ("debug-slur-scoring"))) - && scm_is_pair (inspect_quants)) + SCM inspect_index = slur_->get_property ("inspect-index"); + if (debug_slurs + && scm_is_integer (inspect_index)) + { + opt_idx = scm_to_int (inspect_index); + configurations_[opt_idx]->calculate_score (*this); + opt = configurations_[opt_idx]->score (); + } + else if (debug_slurs + && scm_is_pair (inspect_quants)) { opt_idx = get_closest_index (inspect_quants); - configurations_[opt_idx]->score (*this); - opt = configurations_[opt_idx]->score_; + configurations_[opt_idx]->calculate_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++) + for (vsize i = 0; i < configurations_.size (); i++) + configurations_[i]->calculate_score (*this); + for (vsize i = 0; i < configurations_.size (); i++) { - if (configurations_[i]->score_ < opt) + if (configurations_[i]->score () < opt) { - opt = configurations_[i]->score_; + 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); - - // debug quanting - slur_->set_property ("quant-score", - scm_makfrom0str (configurations_[opt_idx]->score_card_.to_str0 ())); - + if (debug_slurs) + { + string total; + if (opt_idx >= 0) + { + total = configurations_[opt_idx]->card (); + total += to_string (" TOTAL=%.2f idx=%d", configurations_[opt_idx]->score (), opt_idx); + } + else + { + total = "no sol?"; + } + + slur_->set_property ("quant-score", + scm_makfrom0str (total.c_str ())); + } #endif + if (opt_idx < 0) + { + opt_idx = 0; + programming_error ("No optimal slur found. Guessing 0."); + } + return configurations_[opt_idx]->curve_; } +Grob * +Slur_score_state::breakable_bound_item (Direction d) const +{ + Grob *col = slur_->get_bound (d)->get_column (); + + extract_grob_set (slur_, "encompass-objects", extra_encompasses); + + for (vsize i = 0; i < extra_encompasses.size (); i++) + { + Item *item = dynamic_cast (extra_encompasses[i]); + if (item && col == item->get_column ()) + return item; + } + + return 0; +} + int Slur_score_state::get_closest_index (SCM inspect_quants) const { @@ -449,7 +436,7 @@ Slur_score_state::get_closest_index (SCM inspect_quants) const int opt_idx = -1; Real mindist = 1e6; - for (int i = 0; i < configurations_.size (); i++) + for (vsize i = 0; i < configurations_.size (); i++) { Real d = fabs (configurations_[i]->attachment_[LEFT][Y_AXIS] - ins[LEFT]) + fabs (configurations_[i]->attachment_[RIGHT][Y_AXIS] - ins[RIGHT]); @@ -480,7 +467,7 @@ Slur_score_state::get_y_attachment_range () const { end_ys[d] = dir_ * max (max (dir_ * (base_attachments_[d][Y_AXIS] - + parameters_.region_size_ * dir_), + + parameters_.region_size_ * dir_), dir_ * (dir_ + extremes_[d].note_column_->extent (common_[Y_AXIS], Y_AXIS)[dir_])), dir_ * base_attachments_[-d][Y_AXIS]); } @@ -530,6 +517,7 @@ Slur_score_state::get_base_attachments () const && !Stem::is_invisible (stem) && extremes_[d].stem_dir_ == dir_ && Stem::get_beaming (stem, -d) + && Stem::get_beam (stem) && (!spanner_less (slur_, Stem::get_beam (stem)) || has_same_beam_)) y = extremes_[d].stem_extent_[Y_AXIS][dir_]; @@ -553,12 +541,19 @@ Slur_score_state::get_base_attachments () const { if (!extremes_[d].note_column_) { - Real x, y; - if (d == RIGHT) - x = extremes_[d].bound_->extent (common_[X_AXIS], X_AXIS)[d]; + Real x = 0; + Real y = 0; + + if (Grob *g = breakable_bound_item (d)) + { + x = robust_relative_extent (g, common_[X_AXIS], X_AXIS)[RIGHT]; + } + else if (d == RIGHT) + x = robust_relative_extent (extremes_[d].bound_, common_[X_AXIS], X_AXIS)[d]; else x = slur_->get_broken_left_end_align (); - Grob *col = (d == LEFT) ? columns_[0] : columns_.top (); + + Grob *col = (d == LEFT) ? columns_[0] : columns_.back (); if (extremes_[-d].bound_ != col) { @@ -615,20 +610,20 @@ Slur_score_state::move_away_from_staffline (Real y, * 2.0 / staff_space_; if (fabs (pos - my_round (pos)) < 0.2 - && Staff_symbol_referencer::on_staffline (on_staff, (int) rint (pos)) + && Staff_symbol_referencer::on_line (on_staff, (int) rint (pos)) && Staff_symbol_referencer::line_count (on_staff) - 1 >= rint (pos)) y += 1.5 * staff_space_ * dir_ / 10; return y; } -Array +vector Slur_score_state::generate_avoid_offsets () const { - Array avoid; - Link_array encompasses = columns_; + vector avoid; + vector encompasses = columns_; - for (int i = 0; i < encompasses.size (); i++) + for (vsize i = 0; i < encompasses.size (); i++) { if (extremes_[LEFT].note_column_ == encompasses[i] || extremes_[RIGHT].note_column_ == encompasses[i]) @@ -637,11 +632,11 @@ Slur_score_state::generate_avoid_offsets () const 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_)); + avoid.push_back (Offset (inf.x_, y + dir_ * parameters_.free_head_distance_)); } extract_grob_set (slur_, "encompass-objects", extra_encompasses); - for (int i = 0; i < extra_encompasses.size (); i++) + for (vsize i = 0; i < extra_encompasses.size (); i++) { if (Slur::has_interface (extra_encompasses[i])) { @@ -653,7 +648,7 @@ Slur_score_state::generate_avoid_offsets () const small_slur->relative_coordinate (common_[Y_AXIS], Y_AXIS)); z[Y_AXIS] += dir_ * parameters_.free_slur_distance_; - avoid.push (z); + avoid.push_back (z); } else if (extra_encompasses[i]->get_property ("avoid-slur") == ly_symbol2scm ("inside")) { @@ -663,7 +658,7 @@ Slur_score_state::generate_avoid_offsets () const if (!xe.is_empty () && !ye.is_empty ()) - avoid.push (Offset (xe.center(), ye[dir_])); + avoid.push_back (Offset (xe.center(), ye[dir_])); } } return avoid; @@ -675,15 +670,15 @@ 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++) + vector avoid = generate_avoid_offsets (); + for (vsize i = 0; i < configurations_.size (); i++) configurations_[i]->generate_curve (*this, r_0, h_inf, avoid); } -Link_array +vector Slur_score_state::enumerate_attachments (Drul_array end_ys) const { - Link_array scores; + vector scores; Drul_array os; os[LEFT] = base_attachments_[LEFT]; @@ -759,7 +754,7 @@ Slur_score_state::enumerate_attachments (Drul_array end_ys) const s.attachment_ = os; s.index_ = scores.size (); - scores.push (new Slur_configuration (s)); + scores.push_back (new Slur_configuration (s)); os[RIGHT][Y_AXIS] += dir_ * staff_space_ / 2; } @@ -771,12 +766,12 @@ Slur_score_state::enumerate_attachments (Drul_array end_ys) const return scores; } -Array +vector Slur_score_state::get_extra_encompass_infos () const { extract_grob_set (slur_, "encompass-objects", encompasses); - Array collision_infos; - for (int i = encompasses.size (); i--;) + vector collision_infos; + for (vsize i = encompasses.size (); i--;) { if (Slur::has_interface (encompasses[i])) { @@ -788,7 +783,7 @@ Slur_score_state::get_extra_encompass_infos () const for (int k = 0; k < 3; k++) { - Direction hdir = Direction (k / 2 - 1); + Direction hdir = Direction (k - 1); /* Only take bound into account if small slur starts @@ -807,11 +802,11 @@ Slur_score_state::get_extra_encompass_infos () const Interval xext (-1, 1); xext = xext * (thickness_ * 2) + z[X_AXIS]; Extra_collision_info info (small_slur, - k - 1.0, + hdir, xext, yext, parameters_.extra_object_collision_penalty_); - collision_infos.push (info); + collision_infos.push_back (info); } } else @@ -859,7 +854,7 @@ Slur_score_state::get_extra_encompass_infos () const ye.widen (thickness_ * 0.5); xe.widen (thickness_ * 1.0); Extra_collision_info info (g, xp, xe, ye, penalty); - collision_infos.push (info); + collision_infos.push_back (info); } }