X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fstem.cc;h=e155a0611e628b64657a09bf6a0f54241f5d80e0;hb=9ec9ed150f9f9841d058afb3e30746fc1b89b954;hp=6a0fb43485b42cde4af7e0c79d9e3cec368a79d0;hpb=a68f287dcc2277fb7943923426c459dde0426598;p=lilypond.git diff --git a/lily/stem.cc b/lily/stem.cc index 6a0fb43485..e155a0611e 100644 --- a/lily/stem.cc +++ b/lily/stem.cc @@ -14,6 +14,7 @@ */ #include "stem.hh" +#include "spanner.hh" #include // rint using namespace std; @@ -153,7 +154,7 @@ Stem::last_head (Grob *me) Drul_array Stem::extremal_heads (Grob *me) { - const int inf = 1000000; + const int inf = INT_MAX; Drul_array extpos; extpos[DOWN] = inf; extpos[UP] = -inf; @@ -213,28 +214,36 @@ Stem::add_head (Grob *me, Grob *n) bool Stem::is_invisible (Grob *me) { - Real stemlet_length = robust_scm2double (me->get_property ("stemlet-length"), - 0.0); + return !is_normal_stem (me) + && (robust_scm2double (me->get_property ("stemlet-length"), + 0.0) == 0.0); +} - return !((head_count (me) - || stemlet_length > 0.0) - && scm_to_int (me->get_property ("duration-log")) >= 1); + +bool +Stem::is_normal_stem (Grob *me) +{ + return head_count (me) && scm_to_int (me->get_property ("duration-log")) >= 1; } + MAKE_SCHEME_CALLBACK (Stem, pure_height, 3) SCM Stem::pure_height (SCM smob, SCM start, SCM end) { (void) start; (void) end; - - + Grob *me = unsmob_grob (smob); + Interval iv; + + if (!is_normal_stem (me)) + return ly_interval2scm (iv); + Real ss = Staff_symbol_referencer::staff_space (me); Real len = scm_to_double (calc_length (smob)) * ss / 2; Direction dir = get_grob_direction (me); - Interval iv; Interval hp = head_positions (me); if (dir == UP) iv = Interval (0, len); @@ -316,7 +325,7 @@ Stem::calc_stem_end_position (SCM smob) return scm_from_double (stem_end); } - +/* Length is in half-spaces (or: positions) here. */ MAKE_SCHEME_CALLBACK (Stem, calc_length, 1) SCM Stem::calc_length (SCM smob) @@ -363,8 +372,7 @@ Stem::calc_length (SCM smob) (Stem_tremolo::raw_stencil () looks at the beam.) --hwn */ Real minlen = 1.0 - + 2 * t_flag->extent (t_flag, Y_AXIS).length () - / ss; + + 2 * Stem_tremolo::vertical_length (t_flag) / ss; /* We don't want to add the whole extent of the flag because the trem and the flag can overlap partly. beam_translation gives a good @@ -419,12 +427,25 @@ Stem::calc_positioning_done (SCM smob) dir = UP; set_grob_direction (me, dir); } - + + bool is_harmonic_centered = false; + for (vsize i = 0; i < heads.size (); i++) + is_harmonic_centered = is_harmonic_centered + || heads[i]->get_property ("style") == ly_symbol2scm ("harmonic"); + is_harmonic_centered = is_harmonic_centered && is_invisible (me); + Real w = hed->extent (hed, X_AXIS)[dir]; for (vsize i = 0; i < heads.size (); i++) - heads[i]->translate_axis (w - heads[i]->extent (heads[i], X_AXIS)[dir], - X_AXIS); + { + Real amount = w - heads[i]->extent (heads[i], X_AXIS)[dir]; + if (is_harmonic_centered) + amount = + hed->extent (hed, X_AXIS).linear_combination (CENTER) + - heads[i]->extent (heads[i], X_AXIS).linear_combination (CENTER); + + heads[i]->translate_axis (amount, X_AXIS); + } bool parity = true; Real lastpos = Real (Staff_symbol_referencer::get_position (heads[0])); for (vsize i = 1; i < heads.size (); i++) @@ -975,7 +996,7 @@ Stem::beam_multiplicity (Grob *stem) } /* FIXME: Too many properties */ -ADD_INTERFACE (Stem, "stem-interface", +ADD_INTERFACE (Stem, "The stem represent the graphical stem. " "In addition, it internally connects note heads, beams and" "tremolos. "