From e21e3fd69d0204424e93983460926bc0b90f448c Mon Sep 17 00:00:00 2001 From: Han-Wen Nienhuys Date: Tue, 19 Sep 2006 22:26:13 +0000 Subject: [PATCH] * lily/stem-tremolo.cc (translated_stencil): new function. (height): use new function. Fixes tremolos on whole notes. * lily/slur-scoring.cc (get_best_curve): don't crash if no optimal slur found. --- ChangeLog | 8 ++++++++ lily/include/stem-tremolo.hh | 3 ++- lily/slur-scoring.cc | 7 ++++++- lily/stem-tremolo.cc | 39 ++++++++++++++++++++---------------- 4 files changed, 38 insertions(+), 19 deletions(-) diff --git a/ChangeLog b/ChangeLog index 49982cbc4d..dfc56230c3 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2006-09-20 Han-Wen Nienhuys + + * lily/stem-tremolo.cc (translated_stencil): new function. + (height): use new function. Fixes tremolos on whole notes. + + * lily/slur-scoring.cc (get_best_curve): don't crash if no optimal + slur found. + 2006-09-19 Han-Wen Nienhuys * scripts/abc2ly.py (try_parse_comment): idem. diff --git a/lily/include/stem-tremolo.hh b/lily/include/stem-tremolo.hh index 731d2462d3..49b5fd4c5c 100644 --- a/lily/include/stem-tremolo.hh +++ b/lily/include/stem-tremolo.hh @@ -22,7 +22,8 @@ public: DECLARE_SCHEME_CALLBACK (print, (SCM)); DECLARE_SCHEME_CALLBACK (height, (SCM)); DECLARE_SCHEME_CALLBACK (calc_style, (SCM)); - static Stencil raw_stencil (Grob *, Real, Direction stemdir); + static Stencil raw_stencil (Grob *, Real slope, Direction stemdir); + static Stencil translated_stencil (Grob*, Real slope); static Real get_beam_translation (Grob *me); }; diff --git a/lily/slur-scoring.cc b/lily/slur-scoring.cc index ef5002538b..6371082b07 100644 --- a/lily/slur-scoring.cc +++ b/lily/slur-scoring.cc @@ -395,7 +395,6 @@ Slur_score_state::get_best_curve () } else { - programming_error ("No optimal slur found. Guessing 0."); total = "no sol?"; } @@ -404,6 +403,12 @@ Slur_score_state::get_best_curve () } #endif + if (opt_idx < 0) + { + opt_idx = 0; + programming_error ("No optimal slur found. Guessing 0."); + } + return configurations_[opt_idx]->curve_; } diff --git a/lily/stem-tremolo.cc b/lily/stem-tremolo.cc index f15d2c4154..6729aa934c 100644 --- a/lily/stem-tremolo.cc +++ b/lily/stem-tremolo.cc @@ -83,7 +83,8 @@ Stem_tremolo::get_beam_translation (Grob *me) Grob *stem = unsmob_grob (me->get_object ("stem")); Spanner *beam = Stem::get_beam (stem); - return beam ? Beam::get_beam_translation (beam) : 0.81; + return (beam && beam->is_live ()) + ? Beam::get_beam_translation (beam) : 0.81; } Stencil @@ -118,7 +119,7 @@ Stem_tremolo::raw_stencil (Grob *me, Real slope, Direction stemdir) return Stencil (); } - Real beam_translation = get_beam_translation(me); + Real beam_translation = get_beam_translation (me); Stencil mol; for (int i = 0; i < tremolo_flags; i++) @@ -141,40 +142,34 @@ Stem_tremolo::height (SCM smob) /* Cannot use the real slope, since it looks at the Beam. */ - Stencil s1 (raw_stencil (me, 0.35, UP)); + Stencil s1 (translated_stencil (me, 0.35)); return ly_interval2scm (s1.extent (Y_AXIS)); } - -MAKE_SCHEME_CALLBACK (Stem_tremolo, print, 1); -SCM -Stem_tremolo::print (SCM grob) +Stencil +Stem_tremolo::translated_stencil (Grob *me, Real slope) { - Grob *me = unsmob_grob (grob); Grob *stem = unsmob_grob (me->get_object ("stem")); if (!stem) { programming_error ("no stem for stem-tremolo"); - return SCM_EOL; + return Stencil(); } Spanner *beam = Stem::get_beam (stem); Direction stemdir = get_grob_direction (stem); - bool whole_note = Stem::duration_log (stem) <= 0; if (stemdir == 0) stemdir = UP; - Real beam_translation - = (beam && beam->is_live ()) - ? Beam::get_beam_translation (beam) - : 0.81; + bool whole_note = Stem::duration_log (stem) <= 0; + + Real beam_translation = get_beam_translation (me); /* for a whole note, we position relative to the notehead, so we want the stencil aligned on the flag closest to the head */ Direction stencil_dir = whole_note ? -stemdir : stemdir; - Stencil mol = raw_stencil (me, robust_scm2double (me->get_property ("slope"), - 0.25), stencil_dir); + Stencil mol = raw_stencil (me, slope, stencil_dir); Interval mol_ext = mol.extent (Y_AXIS); Real ss = Staff_symbol_referencer::staff_space (me); @@ -207,7 +202,17 @@ Stem_tremolo::print (SCM grob) } mol.translate_axis (end_y, Y_AXIS); - return mol.smobbed_copy (); + return mol; +} + +MAKE_SCHEME_CALLBACK (Stem_tremolo, print, 1); +SCM +Stem_tremolo::print (SCM grob) +{ + Grob *me = unsmob_grob (grob); + + Stencil s = translated_stencil (me, robust_scm2double (me->get_property ("slope"), 0.25)); + return s.smobbed_copy (); } ADD_INTERFACE (Stem_tremolo, "stem-tremolo-interface", -- 2.39.5