{
SCM details = him->get_property ("details");
- /*
- TODO: put in define-grobs.scm
+ /*
+ TODO: The default values should be copied to define-grobs.scm.
*/
INTER_QUANT_PENALTY = get_detail (details, ly_symbol2scm ("inter-quant-penalty"), 1000.0);
SECONDARY_BEAM_DEMERIT = get_detail (details, ly_symbol2scm ("secondary-beam-demerit"), 10.0);
/*
Calculations are relative to a unit-scaled staff, i.e. the quants are
divided by the current staff_space.
-
*/
Real ss = Staff_symbol_referencer::staff_space (me);
Real thickness = Beam::get_thickness (me) / ss;
going to REGION_SIZE == 2, yields another 0.6 second with
wtk1-fugue2.
-
(result indexes between 70 and 575) ? --hwn.
*/
Grob *stem = first_normal_stem (me);
/*
- ugh: stems[0] case happens for chord tremolo.
+ This happens for chord tremolos.
*/
- dir = to_dir ((stem ? stem : stems[0])->get_property ("default-direction"));
+ if (!stem)
+ stem = stems[0];
+
+ if (is_direction (stem->get_property_data ("direction")))
+ dir = to_dir (stem->get_property_data ("direction"));
+ else
+ dir = to_dir (stem->get_property ("default-direction"));
}
}
}
+Interval
+Beam::no_visible_stem_positions (Grob *me, Interval default_value)
+{
+ extract_grob_set (me, "stems", stems);
+ if (stems.empty ())
+ return default_value;
+
+ Interval head_positions;
+ Slice multiplicity;
+ for (vsize i = 0; i < stems.size(); i++)
+ {
+ head_positions.unite (Stem::head_positions (stems[i]));
+ multiplicity.unite (Stem::beam_multiplicity (stems[i]));
+ }
+
+ Direction dir = get_grob_direction (me);
+ Real y = head_positions[dir]
+ + dir * get_beam_translation (me) * multiplicity.length () / 2;
+
+ return Interval (y,y);
+}
+
/*
Compute a first approximation to the beam slope.
int count = normal_stem_count (me);
Interval pos (0,0);
if (count < 1)
- return ly_interval2scm (pos);
+ return ly_interval2scm (no_visible_stem_positions (me, pos));
vector<Real> x_posns;
extract_grob_set (me, "normal-stems", stems);
for normal beams, but for tremolo beams it looks silly otherwise.
*/
if (gap
- && !Stem::is_invisible (s))
+ && !Stem::is_invisible (s))
stem_y += thick * 0.5 * get_grob_direction (s);
/*
static Real get_thickness (Grob *me);
static void connect_beams (Grob *me);
static vector<Beam_segment> get_beam_segments (Grob *me_grob, Grob **common);
+ static Interval no_visible_stem_positions (Grob *me, Interval default_value);
DECLARE_SCHEME_CALLBACK (rest_collision_callback, (SCM element, SCM prev_off));
DECLARE_SCHEME_CALLBACK (print, (SCM));