X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fstem-tremolo.cc;h=f02ff0e6bf7844e9f547922fa28eedb0a06c7329;hb=a77737811657427f9037db99ebaf091ae66d6fc9;hp=6729aa934cf03c79f7bbe90f9956fa8ffbd651c0;hpb=e21e3fd69d0204424e93983460926bc0b90f448c;p=lilypond.git diff --git a/lily/stem-tremolo.cc b/lily/stem-tremolo.cc index 6729aa934c..f02ff0e6bf 100644 --- a/lily/stem-tremolo.cc +++ b/lily/stem-tremolo.cc @@ -1,9 +1,20 @@ /* - stem-tremolo.cc -- implement Stem_tremolo + This file is part of LilyPond, the GNU music typesetter. - source file of the GNU LilyPond music typesetter + Copyright (C) 1997--2010 Han-Wen Nienhuys - (c) 1997--2006 Han-Wen Nienhuys + LilyPond is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + LilyPond is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with LilyPond. If not, see . */ #include "stem-tremolo.hh" @@ -33,8 +44,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) - @@ -84,7 +95,9 @@ Stem_tremolo::get_beam_translation (Grob *me) Spanner *beam = Stem::get_beam (stem); return (beam && beam->is_live ()) - ? Beam::get_beam_translation (beam) : 0.81; + ? Beam::get_beam_translation (beam) + : (Staff_symbol_referencer::staff_space (me) + * robust_scm2double (me->get_property ("length-fraction"), 1.0) * 0.81); } Stencil @@ -147,40 +160,67 @@ Stem_tremolo::height (SCM smob) return ly_interval2scm (s1.extent (Y_AXIS)); } +MAKE_SCHEME_CALLBACK (Stem_tremolo, width, 1); +SCM +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::translated_stencil (Grob *me, Real slope) +Stem_tremolo::untranslated_stencil (Grob *me, Real slope) { Grob *stem = unsmob_grob (me->get_object ("stem")); if (!stem) { programming_error ("no stem for stem-tremolo"); - return Stencil(); + return Stencil (); } - Spanner *beam = Stem::get_beam (stem); Direction stemdir = get_grob_direction (stem); - if (stemdir == 0) + if (!stemdir) stemdir = UP; 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, slope, 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 @@ -192,6 +232,8 @@ Stem_tremolo::translated_stencil (Grob *me, Real slope) 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 @@ -215,12 +257,15 @@ Stem_tremolo::print (SCM grob) 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 "