/*
This file is part of LilyPond, the GNU music typesetter.
- Copyright (C) 1997--2012 Han-Wen Nienhuys <hanwen@xs4all.nl>
+ Copyright (C) 1997--2014 Han-Wen Nienhuys <hanwen@xs4all.nl>
Jan Nieuwenhuizen <janneke@gnu.org>
LilyPond is free software: you can redistribute it and/or modify
dir = to_dir (stem->get_property_data ("direction"));
else
dir = to_dir (stem->get_property ("default-direction"));
+
+ extract_grob_set (stem, "note-heads", heads);
+ /* default position of Kievan heads with beams is down
+ placing this here avoids warnings downstream */
+ if (heads.size())
+ {
+ if (heads[0]->get_property ("style") == ly_symbol2scm ("kievan"))
+ {
+ if (dir == CENTER)
+ dir = DOWN;
+ }
+ }
}
}
}
SCM segments_scm = SCM_EOL;
- SCM *tail = &segments_scm;
- for (vsize i = 0; i < segments.size (); i++)
+ for (vsize i = segments.size (); i--;)
{
- *tail = scm_cons (scm_list_2 (scm_cons (ly_symbol2scm ("vertical-count"),
- scm_from_int (segments[i].vertical_count_)),
- scm_cons (ly_symbol2scm ("horizontal"),
- ly_interval2scm (segments[i].horizontal_))),
- SCM_EOL);
- tail = SCM_CDRLOC (*tail);
+ segments_scm = scm_cons (scm_list_2 (scm_cons (ly_symbol2scm ("vertical-count"),
+ scm_from_int (segments[i].vertical_count_)),
+ scm_cons (ly_symbol2scm ("horizontal"),
+ ly_interval2scm (segments[i].horizontal_))),
+ segments_scm);
}
return segments_scm;
Interval placements = robust_scm2interval (me->get_property ("normalized-endpoints"), Interval (0.0, 0.0));
Stencil the_beam;
- int extreme = (segments[0].vertical_count_ == 0
- ? segments[0].vertical_count_
- : segments.back ().vertical_count_);
+ vsize extreme = (segments[0].vertical_count_ == 0
+ ? segments[0].vertical_count_
+ : segments.back ().vertical_count_);
for (vsize i = 0; i < segments.size (); i++)
{
if (!scm_is_number (scm))
return;
- Interval_set gaps;
-
- gaps.set_full ();
+ vector<Interval> forbidden_intervals;
extract_grob_set (me, "normal-stems", stems);
}
head_extents_array.push_back (head_extents);
- gaps.remove_interval (head_extents);
+ forbidden_intervals.push_back (head_extents);
}
Interval max_gap;
Real max_gap_len = 0.0;
- for (vsize i = gaps.allowed_regions_.size () - 1; i != VPOS; i--)
+ vector<Interval> allowed_regions
+ = Interval_set::interval_union (forbidden_intervals).complement ().intervals ();
+ for (vsize i = allowed_regions.size () - 1; i != VPOS; i--)
{
- Interval gap = gaps.allowed_regions_[i];
+ Interval gap = allowed_regions[i];
/*
the outer gaps are not knees.
rest_max_pos[UP]
) * ss / 2.0
- previous;
+
+ // So that ceil below kicks in for rests that would otherwise brush
+ // up against a beam quanted to a ledger line, add a bit of space
+ // between the beam and the rest.
+ shift += (0.01 * beamdir);
+
/* Always move by a whole number of staff spaces */
shift = ceil (fabs (shift / ss)) * ss * sign (shift);