X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fstem-tremolo.cc;h=ce9e3529b693746d51eea7ba6b75119f308b6a4a;hb=09bf9a18185476020686ff65b5d70b57051be780;hp=cec65cbcafc030db87367f41025fc67d8e59403f;hpb=ad300ca4fff3ea3109961a10a789529e001174e1;p=lilypond.git diff --git a/lily/stem-tremolo.cc b/lily/stem-tremolo.cc index cec65cbcaf..ce9e3529b6 100644 --- a/lily/stem-tremolo.cc +++ b/lily/stem-tremolo.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2006 Han-Wen Nienhuys + (c) 1997--2009 Han-Wen Nienhuys */ #include "stem-tremolo.hh" @@ -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) - @@ -83,7 +83,10 @@ 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) + : (Staff_symbol_referencer::staff_space (me) + * robust_scm2double (me->get_property ("length-fraction"), 1.0) * 0.81); } Stencil @@ -118,7 +121,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,51 +144,72 @@ 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); +MAKE_SCHEME_CALLBACK (Stem_tremolo, width, 1); SCM -Stem_tremolo::print (SCM grob) +Stem_tremolo::width (SCM smob) +{ + Grob *me = unsmob_grob (smob); + + /* + Cannot use the real slope, since it looks at the Beam. + */ + Stencil s1 (untranslated_stencil (me, 0.35)); + + return ly_interval2scm (s1.extent (X_AXIS)); +} + +Real +Stem_tremolo::vertical_length (Grob *me) +{ + return untranslated_stencil (me, 0.35).extent (Y_AXIS).length (); +} + +Stencil +Stem_tremolo::untranslated_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) + if (!stemdir) stemdir = UP; - Real beam_translation - = (beam && beam->is_live ()) - ? Beam::get_beam_translation (beam) - : 0.81; + bool whole_note = Stem::duration_log (stem) <= 0; /* 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); + return raw_stencil (me, slope, stencil_dir); +} - Interval mol_ext = mol.extent (Y_AXIS); - Real ss = Staff_symbol_referencer::staff_space (me); + +Stencil +Stem_tremolo::translated_stencil (Grob *me, Real slope) +{ + Stencil mol = untranslated_stencil (me, slope); - // ugh, rather calc from Stem_tremolo_req - int beam_count = beam ? (Stem::beam_multiplicity (stem).length () + 1) : 0; + Grob *stem = unsmob_grob (me->get_object ("stem")); + if (!stem) + return Stencil (); + + Direction stemdir = get_grob_direction (stem); + if (stemdir == 0) + stemdir = UP; + + Spanner *beam = Stem::get_beam (stem); + Real beam_translation = get_beam_translation (me); - Real beamthickness = 0.0; - SCM sbt = (beam) ? beam->get_property ("thickness") : SCM_EOL; - if (scm_is_number (sbt)) - beamthickness = scm_to_double (sbt) * ss; + int beam_count = beam ? (Stem::beam_multiplicity (stem).length () + 1) : 0; + Real ss = Staff_symbol_referencer::staff_space (me); Real end_y = Stem::stem_end_position (stem) * ss / 2 @@ -197,25 +221,40 @@ Stem_tremolo::print (SCM grob) if (stemdir == UP) end_y -= stemdir * beam_translation * 0.5; } + + bool whole_note = Stem::duration_log (stem) <= 0; if (whole_note) { /* we shouldn't position relative to the end of the stem since the stem is invisible */ vector nhp = Stem::note_head_positions (stem); - Real note_head = (stemdir == UP ? nhp.back () : nhp[0]); - end_y = note_head + stemdir * 2.0; + Real note_head = (stemdir == UP ? nhp.back () : nhp[0]) * ss / 2; + end_y = note_head + stemdir * 1.5; } 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", - "A beam slashing a stem to indicate a tremolo.", +ADD_INTERFACE (Stem_tremolo, + "A beam slashing a stem to indicate a tremolo. The property" + " @code{style} can be @code{default} or @code{rectangle}.", + /* properties */ "beam-thickness " "beam-width " "flag-count " + "length-fraction " "stem " "style " "slope "