/*
This file is part of LilyPond, the GNU music typesetter.
- Copyright (C) 1997--2014 Han-Wen Nienhuys <hanwen@xs4all.nl>
+ Copyright (C) 1997--2015 Han-Wen Nienhuys <hanwen@xs4all.nl>
LilyPond is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
SCM
Stem_tremolo::calc_slope (SCM smob)
{
- Grob *me = Grob::unsmob (smob);
- Grob *stem = Grob::unsmob (me->get_object ("stem"));
+ Grob *me = unsmob<Grob> (smob);
+ Grob *stem = unsmob<Grob> (me->get_object ("stem"));
Spanner *beam = Stem::get_beam (stem);
- if (beam)
+ SCM style = me->get_property ("style");
+
+ if (beam && !scm_is_eq (style, ly_symbol2scm ("constant")))
{
Real dy = 0;
SCM s = beam->get_property ("quantized-positions");
else
/* down stems with flags should have more sloped trems (helps avoid
flag/stem collisions without making the stem very long) */
- return scm_from_double ((Stem::duration_log (stem) >= 3 && get_grob_direction (me) == DOWN)
+ return scm_from_double ((Stem::duration_log (stem) >= 3
+ && get_grob_direction (me) == DOWN && !beam)
? 0.40 : 0.25);
}
SCM
Stem_tremolo::calc_width (SCM smob)
{
- Grob *me = Grob::unsmob (smob);
- Grob *stem = Grob::unsmob (me->get_object ("stem"));
+ Grob *me = unsmob<Grob> (smob);
+ Grob *stem = unsmob<Grob> (me->get_object ("stem"));
Direction dir = get_grob_direction (me);
bool beam = Stem::get_beam (stem);
bool flag = Stem::duration_log (stem) >= 3 && !beam;
return scm_from_double (((dir == UP && flag) || beam) ? 1.0 : 1.5);
}
-MAKE_SCHEME_CALLBACK (Stem_tremolo, calc_style, 1)
+MAKE_SCHEME_CALLBACK (Stem_tremolo, calc_shape, 1)
SCM
-Stem_tremolo::calc_style (SCM smob)
+Stem_tremolo::calc_shape (SCM smob)
{
- Grob *me = Grob::unsmob (smob);
- Grob *stem = Grob::unsmob (me->get_object ("stem"));
+ Grob *me = unsmob<Grob> (smob);
+ Grob *stem = unsmob<Grob> (me->get_object ("stem"));
Direction dir = get_grob_direction (me);
bool beam = Stem::get_beam (stem);
bool flag = Stem::duration_log (stem) >= 3 && !beam;
+ SCM style = me->get_property ("style");
- return ly_symbol2scm (((dir == UP && flag) || beam) ? "rectangle" : "default");
+ return ly_symbol2scm (!scm_is_eq (style, ly_symbol2scm ("constant"))
+ && ((dir == UP && flag) || beam)
+ ? "rectangle" : "beam-like");
}
Real
Stem_tremolo::get_beam_translation (Grob *me)
{
- Grob *stem = Grob::unsmob (me->get_object ("stem"));
+ Grob *stem = unsmob<Grob> (me->get_object ("stem"));
Spanner *beam = Stem::get_beam (stem);
return (beam && beam->is_live ())
Real thick = robust_scm2double (me->get_property ("beam-thickness"), 1);
Real width = robust_scm2double (me->get_property ("beam-width"), 1);
Real blot = me->layout ()->get_dimension (ly_symbol2scm ("blot-diameter"));
- SCM style = me->get_property ("style");
- if (!scm_is_symbol (style))
- style = ly_symbol2scm ("default");
+ SCM shape = me->get_property ("shape");
+ if (!scm_is_symbol (shape))
+ shape = ly_symbol2scm ("beam-like");
width *= ss;
thick *= ss;
Stencil a;
- if (style == ly_symbol2scm ("rectangle"))
+ if (scm_is_eq (shape, ly_symbol2scm ("rectangle")))
a = Lookup::rotated_box (slope, width, thick, blot);
else
a = Lookup::beam (slope, width, thick, blot);
SCM
Stem_tremolo::pure_height (SCM smob, SCM, SCM)
{
- Item *me = Item::unsmob (smob);
+ Item *me = unsmob<Item> (smob);
/*
Cannot use the real slope, since it looks at the Beam.
*/
Stencil s1 (untranslated_stencil (me, 0.35));
- Item *stem = Item::unsmob (me->get_object ("stem"));
+ Item *stem = unsmob<Item> (me->get_object ("stem"));
if (!stem)
return ly_interval2scm (s1.extent (Y_AXIS));
if (!beam)
return ly_interval2scm (s1.extent (Y_AXIS));
- Interval ph = stem->pure_height (stem, 0, INT_MAX);
+ Interval ph = stem->pure_y_extent (stem, 0, INT_MAX);
Stem_info si = Stem::get_stem_info (stem);
ph[-dir] = si.shortest_y_;
int beam_count = Stem::beam_multiplicity (stem).length () + 1;
SCM
Stem_tremolo::width (SCM smob)
{
- Grob *me = Grob::unsmob (smob);
+ Grob *me = unsmob<Grob> (smob);
/*
Cannot use the real slope, since it looks at the Beam.
Stencil
Stem_tremolo::untranslated_stencil (Grob *me, Real slope)
{
- Grob *stem = Grob::unsmob (me->get_object ("stem"));
+ Grob *stem = unsmob<Grob> (me->get_object ("stem"));
if (!stem)
{
programming_error ("no stem for stem-tremolo");
SCM
Stem_tremolo::calc_y_offset (SCM smob)
{
- Grob *me = Grob::unsmob (smob);
+ Grob *me = unsmob<Grob> (smob);
return scm_from_double (y_offset (me, false));
}
SCM, /* start */
SCM /* end */)
{
- Grob *me = Grob::unsmob (smob);
+ Grob *me = unsmob<Grob> (smob);
return scm_from_double (y_offset (me, true));
}
SCM
Stem_tremolo::calc_direction (SCM smob)
{
- Item *me = Item::unsmob (smob);
+ Item *me = unsmob<Item> (smob);
- Item *stem = Item::unsmob (me->get_object ("stem"));
+ Item *stem = unsmob<Item> (me->get_object ("stem"));
if (!stem)
return scm_from_int (CENTER);
*/
Grob *maybe_nc = stem->get_parent (X_AXIS)->get_parent (X_AXIS);
bool whole_note = Stem::duration_log (stem) <= 0;
- if (whole_note && Note_collision_interface::has_interface (maybe_nc))
+ if (whole_note && has_interface<Note_collision_interface> (maybe_nc))
{
Drul_array<bool> avoid_me (false, false);
vector<int> all_nhps = Note_collision_interface::note_head_positions (maybe_nc);
Real
Stem_tremolo::y_offset (Grob *me, bool pure)
{
- Item *stem = Item::unsmob (me->get_object ("stem"));
+ Item *stem = unsmob<Item> (me->get_object ("stem"));
if (!stem)
return 0.0;
if (pure && beam)
{
- Interval ph = stem->pure_height (stem, 0, INT_MAX);
+ Interval ph = stem->pure_y_extent (stem, 0, INT_MAX);
Stem_info si = Stem::get_stem_info (stem);
ph[-dir] = si.shortest_y_;
- return (ph - dir * max (beam_count, 1) * beam_translation)[dir] - dir * 0.5 * me->pure_height (me, 0, INT_MAX).length ();
+ return (ph - dir * max (beam_count, 1) * beam_translation)[dir] - dir * 0.5 * me->pure_y_extent (me, 0, INT_MAX).length ();
}
Real end_y
= (pure
- ? stem->pure_height (stem, 0, INT_MAX)[dir]
+ ? stem->pure_y_extent (stem, 0, INT_MAX)[dir]
: stem->extent (stem, Y_AXIS)[dir])
- dir * max (beam_count, 1) * beam_translation
- Stem::beam_end_corrective (stem);
SCM
Stem_tremolo::print (SCM grob)
{
- Grob *me = Grob::unsmob (grob);
+ Grob *me = unsmob<Grob> (grob);
Stencil s = untranslated_stencil (me, robust_scm2double (me->get_property ("slope"), 0.25));
return s.smobbed_copy ();
ADD_INTERFACE (Stem_tremolo,
"A beam slashing a stem to indicate a tremolo. The property"
- " @code{style} can be @code{default} or @code{rectangle}.",
+ " @code{shape} can be @code{beam-like} or @code{rectangle}.",
/* properties */
"beam-thickness "
"flag-count "
"length-fraction "
"stem "
- "style "
+ "shape "
"slope "
);