- {
- Interval flag_ext = flag (me).extent (Y_AXIS);
- if (!flag_ext.is_empty ())
- minlen += 2 * flag_ext.length () / ss;
-
- /* The clash is smaller for down stems (since the tremolo is
- angled up.) */
- if (dir == DOWN)
- minlen -= 1.0;
- }
- length = length >? (minlen + 1.0);
- }
-
- Real st = dir ? hp[dir] + dir * length : 0;
-
- /* TODO: change name to extend-stems to staff/center/'() */
- bool no_extend_b = to_boolean (me->get_property ("no-stem-extend"));
- if (!no_extend_b && dir * st < 0)
- st = 0.0;
-
- /* Make a little room if we have a upflag and there is a dot.
- previous approach was to lengthen the stem. This is not
- good typesetting practice. */
- if (!get_beam (me) && dir == UP
- && durlog > 2)
- {
- Grob * closest_to_flag = extremal_heads (me)[dir];
- Grob * dots = closest_to_flag
- ? Rhythmic_head::get_dots (closest_to_flag ) : 0;
-
- if (dots)
- {
- Real dp = Staff_symbol_referencer::get_position (dots);
- Real flagy = flag (me).extent (Y_AXIS)[-dir] * 2 / ss;
-
- /* Very gory: add myself to the X-support of the parent,
- which should be a dot-column. */
- if (dir * (st + flagy - dp) < 0.5)
- {
- Grob *par = dots->get_parent (X_AXIS);
-
- if (Dot_column::has_interface (par))
- {
- Side_position_interface::add_support (par, me);
-
- /* TODO: apply some better logic here. The flag is
- curved inwards, so this will typically be too
- much. */
- }
- }
- }
+ {
+ Real beam_trans = Stem_tremolo::get_beam_translation (t_flag);
+ /* the obvious choice is (durlog - 2) here, but we need a bit more space. */
+ minlen += 2 * (durlog - 1.5) * beam_trans;
+
+ /* up-stems need even a little more space to avoid collisions. This
+ needs to be in sync with the tremolo positioning code in
+ Stem_tremolo::print */
+ if (dir == UP)
+ minlen += beam_trans;
+ }
+ length = max (length, minlen + 1.0);