X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fstem-tremolo.cc;h=4d1678889a63ee382a4a207bf5d31fd2424194f2;hb=6156bb1b68443fdb3dcf8321eb8b85e6e384ffbb;hp=f15d2c4154c8a3a7b5dae379bbd5ff3368ba1415;hpb=9f3572d98bb948c9689cd1f75401a029451fa001;p=lilypond.git diff --git a/lily/stem-tremolo.cc b/lily/stem-tremolo.cc index f15d2c4154..4d1678889a 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--2011 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) - @@ -83,7 +94,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 +132,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 +155,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; - Real beamthickness = 0.0; - SCM sbt = (beam) ? beam->get_property ("thickness") : SCM_EOL; - if (scm_is_number (sbt)) - beamthickness = scm_to_double (sbt) * ss; + Spanner *beam = Stem::get_beam (stem); + Real beam_translation = get_beam_translation (me); + + 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,6 +232,8 @@ 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 @@ -207,15 +244,28 @@ 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", - "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 "