X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fbeam-quanting.cc;h=e150a51594d3b0a4c8119f780769abac28e76254;hb=ce593a5d9614d463ac0255eac17ceb50ce3bcc29;hp=d8544b9b18de2c402e0a875874b73104ffe8d28c;hpb=4ecdbd7d70ca7441be4dddd15ac01cc255bc2a35;p=lilypond.git diff --git a/lily/beam-quanting.cc b/lily/beam-quanting.cc index d8544b9b18..e150a51594 100644 --- a/lily/beam-quanting.cc +++ b/lily/beam-quanting.cc @@ -3,22 +3,24 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2005 Han-Wen Nienhuys + (c) 1997--2006 Han-Wen Nienhuys Jan Nieuwenhuizen */ #include "beam.hh" #include -#include using namespace std; -#include "warn.hh" -#include "staff-symbol-referencer.hh" -#include "stem.hh" +#include "grob.hh" +#include "align-interface.hh" +#include "international.hh" #include "output-def.hh" #include "pointer-group-interface.hh" -#include "align-interface.hh" +#include "staff-symbol-referencer.hh" +#include "stem.hh" +#include "warn.hh" +#include "main.hh" Real get_detail (SCM alist, SCM sym, Real def) @@ -61,8 +63,8 @@ struct Quant_score Real yr; Real demerits; -#if DEBUG_QUANTING - String score_card_; +#if DEBUG_BEAM_SCORING + string score_card_; #endif }; @@ -78,11 +80,11 @@ struct Quant_score */ int -best_quant_score_idx (Array const &qscores) +best_quant_score_idx (vector const &qscores) { Real best = 1e6; int best_idx = -1; - for (int i = qscores.size (); i--;) + for (vsize i = qscores.size (); i--;) { if (qscores[i].demerits < best) { @@ -94,18 +96,17 @@ best_quant_score_idx (Array const &qscores) return best_idx; } -MAKE_SCHEME_CALLBACK (Beam, quanting, 1); +MAKE_SCHEME_CALLBACK (Beam, quanting, 2); SCM -Beam::quanting (SCM smob) +Beam::quanting (SCM smob, SCM posns) { Grob *me = unsmob_grob (smob); Beam_quant_parameters parameters; parameters.fill (me); - SCM s = me->get_property ("positions"); - Real yl = scm_to_double (scm_car (s)); - Real yr = scm_to_double (scm_cdr (s)); + Real yl = scm_to_double (scm_car (posns)); + Real yr = scm_to_double (scm_cdr (posns)); /* Calculations are relative to a unit-scaled staff, i.e. the quants are @@ -124,8 +125,8 @@ Beam::quanting (SCM smob) Real quants [] = {straddle, sit, inter, hang }; int num_quants = int (sizeof (quants) / sizeof (Real)); - Array quantsl; - Array quantsr; + vector quantsl; + vector quantsr; /* going to REGION_SIZE == 2, yields another 0.6 second with @@ -140,11 +141,11 @@ Beam::quanting (SCM smob) Do stem computations. These depend on YL and YR linearly, so we can precompute for every stem 2 factors. */ - Link_array stems + vector stems = extract_grob_array (me, "stems"); - Array stem_infos; - Array base_lengths; - Array stem_xposns; + vector stem_infos; + vector base_lengths; + vector stem_xposns; Drul_array dirs_found (0, 0); Grob *common[2]; @@ -164,21 +165,21 @@ Beam::quanting (SCM smob) stem_y != 0.0, when we're cross staff. */ - for (int i = 0; i < stems.size (); i++) + for (vsize i = 0; i < stems.size (); i++) { Grob *s = stems[i]; Stem_info si (Stem::get_stem_info (s)); si.scale (1 / ss); - stem_infos.push (si); - dirs_found[stem_infos.top ().dir_] = true; + stem_infos.push_back (si); + dirs_found[stem_infos.back ().dir_] = true; bool f = to_boolean (s->get_property ("french-beaming")) && s != lvs && s != fvs; - base_lengths.push (calc_stem_y (me, s, common, xl, xr, + base_lengths.push_back (calc_stem_y (me, s, common, xl, xr, Interval (0, 0), f) / ss); - stem_xposns.push (s->relative_coordinate (common[X_AXIS], X_AXIS)); + stem_xposns.push_back (s->relative_coordinate (common[X_AXIS], X_AXIS)); } bool xstaff = false; @@ -189,7 +190,7 @@ Beam::quanting (SCM smob) } Direction ldir = Direction (stem_infos[0].dir_); - Direction rdir = Direction (stem_infos.top ().dir_); + Direction rdir = Direction (stem_infos.back ().dir_); bool is_knee = dirs_found[LEFT] && dirs_found[RIGHT]; int region_size = (int) parameters.REGION_SIZE; @@ -206,28 +207,28 @@ Beam::quanting (SCM smob) for (int i = -region_size; i < region_size; i++) for (int j = 0; j < num_quants; j++) { - quantsl.push (i + quants[j] + int (yl)); - quantsr.push (i + quants[j] + int (yr)); + quantsl.push_back (i + quants[j] + int (yl)); + quantsr.push_back (i + quants[j] + int (yr)); } - Array qscores; + vector qscores; - for (int l = 0; l < quantsl.size (); l++) - for (int r = 0; r < quantsr.size (); r++) + for (vsize l = 0; l < quantsl.size (); l++) + for (vsize r = 0; r < quantsr.size (); r++) { Quant_score qs; qs.yl = quantsl[l]; qs.yr = quantsr[r]; qs.demerits = 0.0; - qscores.push (qs); + qscores.push_back (qs); } /* This is a longish function, but we don't separate this out into neat modular separate subfunctions, as the subfunctions would be called for many values of YL, YR. By precomputing various parameters outside of the loop, we can save a lot of time. */ - for (int i = qscores.size (); i--;) + for (vsize i = qscores.size (); i--;) { Real d = score_slopes_dy (qscores[i].yl, qscores[i].yr, dy_mus, yr- yl, @@ -235,7 +236,7 @@ Beam::quanting (SCM smob) xstaff, ¶meters); qscores[i].demerits += d; -#if DEBUG_QUANTING +#if DEBUG_BEAM_SCORING qscores[i].score_card_ += to_string ("S%.2f", d); #endif } @@ -243,12 +244,12 @@ Beam::quanting (SCM smob) Real rad = Staff_symbol_referencer::staff_radius (me); Drul_array edge_beam_counts (Stem::beam_multiplicity (stems[0]).length () + 1, - Stem::beam_multiplicity (stems.top ()).length () + 1); + Stem::beam_multiplicity (stems.back ()).length () + 1); Real beam_translation = get_beam_translation (me) / ss; Real reasonable_score = (is_knee) ? 200000 : 100; - for (int i = qscores.size (); i--;) + for (vsize i = qscores.size (); i--;) if (qscores[i].demerits < reasonable_score) { Real d = score_forbidden_quants (qscores[i].yl, qscores[i].yr, @@ -256,12 +257,12 @@ Beam::quanting (SCM smob) edge_beam_counts, ldir, rdir, ¶meters); qscores[i].demerits += d; -#if DEBUG_QUANTING +#if DEBUG_BEAM_SCORING qscores[i].score_card_ += to_string (" F %.2f", d); #endif } - for (int i = qscores.size (); i--;) + for (vsize i = qscores.size (); i--;) if (qscores[i].demerits < reasonable_score) { Real d = score_stem_lengths (stems, stem_infos, @@ -271,24 +272,22 @@ Beam::quanting (SCM smob) qscores[i].yl, qscores[i].yr, ¶meters); qscores[i].demerits += d; -#if DEBUG_QUANTING +#if DEBUG_BEAM_SCORING qscores[i].score_card_ += to_string (" L %.2f", d); #endif } int best_idx = best_quant_score_idx (qscores); -#if DEBUG_QUANTING +#if DEBUG_BEAM_SCORING SCM inspect_quants = me->get_property ("inspect-quants"); - if (to_boolean (me->get_layout ()->lookup_variable (ly_symbol2scm ("debug-beam-quanting"))) + if (to_boolean (me->layout ()->lookup_variable (ly_symbol2scm ("debug-beam-scoring"))) && scm_is_pair (inspect_quants)) { Drul_array ins = ly_scm2interval (inspect_quants); - int i = 0; - Real mindist = 1e6; - for (; i < qscores.size (); i++) + for (vsize i = 0; i < qscores.size (); i++) { Real d = fabs (qscores[i].yl- ins[LEFT]) + fabs (qscores[i].yr - ins[RIGHT]); if (d < mindist) @@ -298,38 +297,42 @@ Beam::quanting (SCM smob) } } if (mindist > 1e5) - programming_error ("can't find quant"); + programming_error ("cannot find quant"); } #endif + + Interval final_positions; if (best_idx < 0) { warning (_ ("no feasible beam position")); - me->set_property ("positions", ly_interval2scm (Interval (0, 0))); + final_positions = Interval (0, 0); } else - me->set_property ("positions", - ly_interval2scm (Drul_array (qscores[best_idx].yl, - qscores[best_idx].yr))); -#if DEBUG_QUANTING + { + final_positions = Drul_array (qscores[best_idx].yl, + qscores[best_idx].yr); + } + +#if DEBUG_BEAM_SCORING if (best_idx >= 0 - && to_boolean (me->get_layout ()->lookup_variable (ly_symbol2scm ("debug-beam-quanting")))) + && to_boolean (me->layout ()->lookup_variable (ly_symbol2scm ("debug-beam-scoring")))) { qscores[best_idx].score_card_ += to_string ("i%d", best_idx); // debug quanting me->set_property ("quant-score", - scm_makfrom0str (qscores[best_idx].score_card_.to_str0 ())); + scm_makfrom0str (qscores[best_idx].score_card_.c_str ())); } #endif - return SCM_UNSPECIFIED; + return ly_interval2scm (final_positions); } Real -Beam::score_stem_lengths (Link_array const &stems, - Array const &stem_infos, - Array const &base_stem_ys, - Array const &stem_xs, +Beam::score_stem_lengths (vector const &stems, + vector const &stem_infos, + vector const &base_stem_ys, + vector const &stem_xs, Real xl, Real xr, bool knee, Real yl, Real yr, @@ -340,7 +343,7 @@ Beam::score_stem_lengths (Link_array const &stems, Drul_array score (0, 0); Drul_array count (0, 0); - for (int i = 0; i < stems.size (); i++) + for (vsize i = 0; i < stems.size (); i++) { Grob *s = stems[i]; if (Stem::is_invisible (s))