From 277bacb942a0ea012f656eb04807c6a83f4e6553 Mon Sep 17 00:00:00 2001 From: Han-Wen Nienhuys Date: Thu, 4 Jan 2007 21:40:45 +0100 Subject: [PATCH] Reduce number of Stem::is_invisible() calls. Cache stems with is_normal_stem() in normal-stems in Beam grob --- lily/beam-quanting.cc | 4 +- lily/beam.cc | 120 +++++++++++++++------------------ lily/dynamic-engraver.cc | 4 -- lily/include/beam.hh | 7 +- lily/stem-tremolo.cc | 4 +- lily/stem.cc | 9 +-- scm/define-grob-properties.scm | 1 + scm/define-grobs.scm | 1 + 8 files changed, 67 insertions(+), 83 deletions(-) diff --git a/lily/beam-quanting.cc b/lily/beam-quanting.cc index 0d7cca3e88..0338ecd7ec 100644 --- a/lily/beam-quanting.cc +++ b/lily/beam-quanting.cc @@ -154,8 +154,8 @@ Beam::quanting (SCM smob, SCM posns) for (int a = 2; a--;) common[a] = common_refpoint_of_array (stems, me, Axis (a)); - Grob *fvs = first_visible_stem (me); - Grob *lvs = last_visible_stem (me); + Grob *fvs = first_normal_stem (me); + Grob *lvs = last_normal_stem (me); Real xl = fvs ? fvs->relative_coordinate (common[X_AXIS], X_AXIS) : 0.0; Real xr = fvs ? lvs->relative_coordinate (common[X_AXIS], X_AXIS) : 0.0; diff --git a/lily/beam.cc b/lily/beam.cc index a1beb8009a..ba6dc277e9 100644 --- a/lily/beam.cc +++ b/lily/beam.cc @@ -41,6 +41,7 @@ #include "staff-symbol-referencer.hh" #include "stem.hh" #include "warn.hh" +#include "grob-array.hh" #if DEBUG_BEAM_SCORING #include "text-interface.hh" // debug output. @@ -119,6 +120,21 @@ Beam::get_beam_count (Grob *me) return m; } +MAKE_SCHEME_CALLBACK (Beam, calc_normal_stems, 1); +SCM +Beam::calc_normal_stems (SCM smob) +{ + Grob *me = unsmob_grob (smob); + + extract_grob_set (me, "stems", stems); + SCM val = Grob_array::make_array (); + Grob_array *ga = unsmob_grob_array (val); + for (vsize i = 0; i < stems.size (); i++) + if (Stem::is_normal_stem (stems[i])) + ga->add (stems[i]); + + return val; +} MAKE_SCHEME_CALLBACK (Beam, calc_direction, 1); SCM @@ -135,7 +151,7 @@ Beam::calc_direction (SCM smob) Direction dir = CENTER; - int count = visible_stem_count (me); + int count = normal_stem_count (me); if (count < 2) { extract_grob_set (me, "stems", stems); @@ -148,7 +164,7 @@ Beam::calc_direction (SCM smob) } else { - Grob *stem = first_visible_stem (me); + Grob *stem = first_normal_stem (me); /* ugh: stems[0] case happens for chord tremolo. @@ -463,10 +479,10 @@ Beam::print (SCM grob) vector segments = get_beam_segments (me, &commonx); Interval span; - if (visible_stem_count (me)) + if (normal_stem_count (me)) { - span[LEFT] = first_visible_stem (me)->relative_coordinate (commonx, X_AXIS); - span[RIGHT] = last_visible_stem (me)->relative_coordinate (commonx, X_AXIS); + span[LEFT] = first_normal_stem (me)->relative_coordinate (commonx, X_AXIS); + span[RIGHT] = last_normal_stem (me)->relative_coordinate (commonx, X_AXIS); } else { @@ -657,7 +673,7 @@ Beam::consider_auto_knees (Grob *me) gaps.set_full (); - extract_grob_set (me, "stems", stems); + extract_grob_set (me, "normal-stems", stems); Grob *common = common_refpoint_of_array (stems, me, Y_AXIS); Real staff_space = Staff_symbol_referencer::staff_space (me); @@ -666,8 +682,6 @@ Beam::consider_auto_knees (Grob *me) for (vsize i = 0; i < stems.size (); i++) { Grob *stem = stems[i]; - if (Stem::is_invisible (stem)) - continue; Interval head_extents = Stem::head_positions (stem); if (!head_extents.is_empty ()) @@ -727,9 +741,6 @@ Beam::consider_auto_knees (Grob *me) for (vsize i = 0; i < stems.size (); i++) { Grob *stem = stems[i]; - if (Stem::is_invisible (stem)) - continue; - Interval head_extents = head_extents_array[j++]; Direction d = (head_extents.center () < max_gap.center ()) @@ -792,7 +803,7 @@ Beam::calc_stem_shorten (SCM smob) return scm_from_int (0); Real forced_fraction = 1.0 * forced_stem_count (me) - / visible_stem_count (me); + / normal_stem_count (me); int beam_count = get_beam_count (me); @@ -828,27 +839,27 @@ Beam::calc_least_squares_positions (SCM smob, SCM posns) Grob *me = unsmob_grob (smob); - int count = visible_stem_count (me); + int count = normal_stem_count (me); Interval pos (0,0); if (count < 1) return ly_interval2scm (pos); vector x_posns; - extract_grob_set (me, "stems", stems); + extract_grob_set (me, "normal-stems", stems); Grob *commonx = common_refpoint_of_array (stems, me, X_AXIS); Grob *commony = common_refpoint_of_array (stems, me, Y_AXIS); Real my_y = me->relative_coordinate (commony, Y_AXIS); - Grob *fvs = first_visible_stem (me); - Grob *lvs = last_visible_stem (me); + Grob *fvs = first_normal_stem (me); + Grob *lvs = last_normal_stem (me); Interval ideal (Stem::get_stem_info (fvs).ideal_y_ + fvs->relative_coordinate (commony, Y_AXIS) - my_y, Stem::get_stem_info (lvs).ideal_y_ + lvs->relative_coordinate (commony, Y_AXIS) - my_y); - Real x0 = first_visible_stem (me)->relative_coordinate (commonx, X_AXIS); + Real x0 = first_normal_stem (me)->relative_coordinate (commonx, X_AXIS); for (vsize i = 0; i < stems.size (); i++) { Grob *s = stems[i]; @@ -856,7 +867,7 @@ Beam::calc_least_squares_positions (SCM smob, SCM posns) Real x = s->relative_coordinate (commonx, X_AXIS) - x0; x_posns.push_back (x); } - Real dx = last_visible_stem (me)->relative_coordinate (commonx, X_AXIS) - x0; + Real dx = last_normal_stem (me)->relative_coordinate (commonx, X_AXIS) - x0; Real y = 0; Real slope = 0; @@ -864,8 +875,8 @@ Beam::calc_least_squares_positions (SCM smob, SCM posns) Real ldy = 0.0; if (!ideal.delta ()) { - Interval chord (Stem::chord_start_y (first_visible_stem (me)), - Stem::chord_start_y (last_visible_stem (me))); + Interval chord (Stem::chord_start_y (stems[0]), + Stem::chord_start_y (stems.back ())); /* Simple beams (2 stems) on middle line should be allowed to be slightly sloped. @@ -897,9 +908,6 @@ Beam::calc_least_squares_positions (SCM smob, SCM posns) for (vsize i = 0; i < stems.size (); i++) { Grob *s = stems[i]; - if (!Stem::is_normal_stem (s)) - continue; - ideals.push_back (Offset (x_posns[i], Stem::get_stem_info (s).ideal_y_ + s->relative_coordinate (commony, Y_AXIS) @@ -945,7 +953,7 @@ Beam::shift_region_to_valid (SCM grob, SCM posns) Grob *commonx = common_refpoint_of_array (stems, me, X_AXIS); Grob *commony = common_refpoint_of_array (stems, me, Y_AXIS); - Grob *fvs = first_visible_stem (me); + Grob *fvs = first_normal_stem (me); if (!fvs) return posns; @@ -959,7 +967,7 @@ Beam::shift_region_to_valid (SCM grob, SCM posns) x_posns.push_back (x); } - Grob *lvs = last_visible_stem (me); + Grob *lvs = last_normal_stem (me); if (!lvs) return posns; @@ -1036,7 +1044,7 @@ Beam::slope_damping (SCM smob, SCM posns) Grob *me = unsmob_grob (smob); Drul_array pos = ly_scm2interval (posns); - if (visible_stem_count (me) <= 1) + if (normal_stem_count (me) <= 1) return posns; @@ -1056,13 +1064,13 @@ Beam::slope_damping (SCM smob, SCM posns) Real dy = pos[RIGHT] - pos[LEFT]; - Grob *fvs = first_visible_stem (me); - Grob *lvs = last_visible_stem (me); + Grob *fvs = first_normal_stem (me); + Grob *lvs = last_normal_stem (me); Grob *commonx = fvs->common_refpoint (lvs, X_AXIS); - Real dx = last_visible_stem (me)->relative_coordinate (commonx, X_AXIS) - - first_visible_stem (me)->relative_coordinate (commonx, X_AXIS); + Real dx = last_normal_stem (me)->relative_coordinate (commonx, X_AXIS) + - first_normal_stem (me)->relative_coordinate (commonx, X_AXIS); Real slope = dy && dx ? dy / dx : 0; @@ -1176,8 +1184,8 @@ Beam::set_stem_lengths (SCM smob) thick = get_thickness (me); } - Grob *fvs = first_visible_stem (me); - Grob *lvs = last_visible_stem (me); + Grob *fvs = first_normal_stem (me); + Grob *lvs = last_normal_stem (me); Real xl = fvs ? fvs->relative_coordinate (common[X_AXIS], X_AXIS) : 0.0; Real xr = lvs ? lvs->relative_coordinate (common[X_AXIS], X_AXIS) : 0.0; @@ -1249,16 +1257,13 @@ Beam::set_beaming (Grob *me, Beaming_pattern const *beaming) int Beam::forced_stem_count (Grob *me) { - extract_grob_set (me, "stems", stems); + extract_grob_set (me, "normal-stems", stems); int f = 0; for (vsize i = 0; i < stems.size (); i++) { Grob *s = stems[i]; - if (Stem::is_invisible (s)) - continue; - /* I can imagine counting those boundaries as a half forced stem, but let's count them full for now. */ Direction defdir = to_dir (s->get_property ("default-direction")); @@ -1272,42 +1277,24 @@ Beam::forced_stem_count (Grob *me) } int -Beam::visible_stem_count (Grob *me) +Beam::normal_stem_count (Grob *me) { - extract_grob_set (me, "stems", stems); - int c = 0; - for (vsize i = stems.size (); i--;) - { - if (!Stem::is_invisible (stems[i])) - c++; - } - return c; + extract_grob_set (me, "normal-stems", stems); + return stems.size (); } Grob * -Beam::first_visible_stem (Grob *me) +Beam::first_normal_stem (Grob *me) { - extract_grob_set (me, "stems", stems); - - for (vsize i = 0; i < stems.size (); i++) - { - if (Stem::is_normal_stem (stems[i])) - return stems[i]; - } - return 0; + extract_grob_set (me, "normal-stems", stems); + return stems.size () ? stems[0] : 0; } Grob * -Beam::last_visible_stem (Grob *me) +Beam::last_normal_stem (Grob *me) { - extract_grob_set (me, "stems", stems); - - for (vsize i = stems.size (); i--;) - { - if (Stem::is_normal_stem (stems[i])) - return stems[i]; - } - return 0; + extract_grob_set (me, "normal-stems", stems); + return stems.size () ? stems.back () : 0; } /* @@ -1337,7 +1324,7 @@ Beam::rest_collision_callback (SCM smob, SCM prev_offset) Grob *beam = unsmob_grob (stem->get_object ("beam")); if (!beam || !Beam::has_interface (beam) - || !Beam::visible_stem_count (beam)) + || !Beam::normal_stem_count (beam)) return scm_from_double (0.0); Drul_array pos (robust_scm2drul (beam->get_property ("positions"), @@ -1349,8 +1336,8 @@ Beam::rest_collision_callback (SCM smob, SCM prev_offset) Real dy = pos[RIGHT] - pos[LEFT]; - Drul_array visible_stems (first_visible_stem (beam), - last_visible_stem (beam)); + Drul_array visible_stems (first_normal_stem (beam), + last_normal_stem (beam)); extract_grob_set (beam, "stems", stems); Grob *common = common_refpoint_of_array (stems, beam, X_AXIS); @@ -1480,6 +1467,7 @@ ADD_INTERFACE (Beam, "length-fraction " "least-squares-dy " "neutral-direction " + "normal-stems " "positions " "quant-score " "quantized-positions " diff --git a/lily/dynamic-engraver.cc b/lily/dynamic-engraver.cc index 0bacd813fd..e3d4f09581 100644 --- a/lily/dynamic-engraver.cc +++ b/lily/dynamic-engraver.cc @@ -390,7 +390,6 @@ Dynamic_engraver::typeset_all () } } - void Dynamic_engraver::acknowledge_accidental (Grob_info info) { @@ -398,7 +397,6 @@ Dynamic_engraver::acknowledge_accidental (Grob_info info) Side_position_interface::add_support (line_spanner_, info.grob ()); } - void Dynamic_engraver::acknowledge_stem_tremolo (Grob_info info) { @@ -406,7 +404,6 @@ Dynamic_engraver::acknowledge_stem_tremolo (Grob_info info) Side_position_interface::add_support (line_spanner_, info.grob ()); } - void Dynamic_engraver::acknowledge_slur (Grob_info info) { @@ -414,7 +411,6 @@ Dynamic_engraver::acknowledge_slur (Grob_info info) Side_position_interface::add_support (line_spanner_, info.grob ()); } - void Dynamic_engraver::acknowledge_note_column (Grob_info info) { diff --git a/lily/include/beam.hh b/lily/include/beam.hh index 3eb8027f49..f521f180c2 100644 --- a/lily/include/beam.hh +++ b/lily/include/beam.hh @@ -69,9 +69,9 @@ bool operator <(Beam_stem_segment const &a, Beam_stem_segment const &b); class Beam { public: - static int visible_stem_count (Grob *); - static Grob *first_visible_stem (Grob *); - static Grob *last_visible_stem (Grob *); + static int normal_stem_count (Grob *); + static Grob *first_normal_stem (Grob *); + static Grob *last_normal_stem (Grob *); DECLARE_GROB_INTERFACE(); static void add_stem (Grob *, Grob *); static bool is_knee (Grob *); @@ -90,6 +90,7 @@ public: DECLARE_SCHEME_CALLBACK (calc_direction, (SCM)); DECLARE_SCHEME_CALLBACK (calc_positions, (SCM)); DECLARE_SCHEME_CALLBACK (calc_least_squares_positions, (SCM, SCM)); + DECLARE_SCHEME_CALLBACK (calc_normal_stems, (SCM)); DECLARE_SCHEME_CALLBACK (calc_concaveness, (SCM)); DECLARE_SCHEME_CALLBACK (set_stem_lengths, (SCM)); diff --git a/lily/stem-tremolo.cc b/lily/stem-tremolo.cc index cf927a5e51..60cde74744 100644 --- a/lily/stem-tremolo.cc +++ b/lily/stem-tremolo.cc @@ -33,8 +33,8 @@ Stem_tremolo::calc_slope (SCM smob) if (is_number_pair (s)) dy = - scm_to_double (scm_car (s)) + scm_to_double (scm_cdr (s)); - Grob *s2 = Beam::last_visible_stem (beam); - Grob *s1 = Beam::first_visible_stem (beam); + Grob *s2 = Beam::last_normal_stem (beam); + Grob *s1 = Beam::first_normal_stem (beam); Grob *common = s1->common_refpoint (s2, X_AXIS); Real dx = s2->relative_coordinate (common, X_AXIS) - diff --git a/lily/stem.cc b/lily/stem.cc index 89f6560318..e155a0611e 100644 --- a/lily/stem.cc +++ b/lily/stem.cc @@ -214,12 +214,9 @@ Stem::add_head (Grob *me, Grob *n) bool Stem::is_invisible (Grob *me) { - Real stemlet_length = robust_scm2double (me->get_property ("stemlet-length"), - 0.0); - - return !((head_count (me) - || stemlet_length > 0.0) - && scm_to_int (me->get_property ("duration-log")) >= 1); + return !is_normal_stem (me) + && (robust_scm2double (me->get_property ("stemlet-length"), + 0.0) == 0.0); } diff --git a/scm/define-grob-properties.scm b/scm/define-grob-properties.scm index 918fe5d11f..9d354b8d22 100644 --- a/scm/define-grob-properties.scm +++ b/scm/define-grob-properties.scm @@ -508,6 +508,7 @@ where this is set in.") (note-columns ,pair? "list of NoteColumn grobs.") + (normal-stems ,ly:grob-array? "Array of visible stems.") (note-heads ,ly:grob-array? "List of note head grobs") (note-head ,ly:grob? "A single note head") (right-items ,ly:grob-array? "") diff --git a/scm/define-grobs.scm b/scm/define-grobs.scm index 5e17ff84b9..34618b9b77 100644 --- a/scm/define-grobs.scm +++ b/scm/define-grobs.scm @@ -349,6 +349,7 @@ ;; only for debugging. (font-family . roman) (meta . ((class . Spanner) + (object-callbacks . ((normal-stems . ,ly:beam::calc-normal-stems))) (interfaces . (staff-symbol-referencer-interface beam-interface)))))) -- 2.39.5