#include "misc.hh"
#include "beam.hh"
#include "rest.hh"
-#include "group-interface.hh"
+#include "pointer-group-interface.hh"
#include "staff-symbol-referencer.hh"
#include "side-position-interface.hh"
#include "dot-column.hh"
Grob *
Stem::support_head (Grob *me)
{
- if (head_count (me) == 1)
- /* UGH. */
- return unsmob_grob (scm_car (me->get_property ("note-heads")));
+ extract_grob_set (me, "note-heads", heads);
+ if (heads.size () == 1)
+ return heads[0];
+
return first_head (me);
}
extpos[UP] = -inf;
Drul_array<Grob *> exthead (0, 0);
- for (SCM s = me->get_property ("note-heads"); scm_is_pair (s);
- s = scm_cdr (s))
+ extract_grob_set (me, "note-heads", heads);
+
+ for (int i = heads.size (); i--;)
{
- Grob *n = unsmob_grob (scm_car (s));
+ Grob *n = heads[i];
int p = Staff_symbol_referencer::get_rounded_position (n);
Direction d = LEFT;
Stem::note_head_positions (Grob *me)
{
Array<int> ps;
- for (SCM s = me->get_property ("note-heads"); scm_is_pair (s);
- s = scm_cdr (s))
+ extract_grob_set (me, "note-heads", heads);
+
+ for (int i = heads.size (); i--;)
{
- Grob *n = unsmob_grob (scm_car (s));
+ Grob *n = heads[i];
int p = Staff_symbol_referencer::get_rounded_position (n);
ps.push (p);
void
Stem::add_head (Grob *me, Grob *n)
{
- n->set_property ("stem", me->self_scm ());
+ n->set_object ("stem", me->self_scm ());
n->add_dependency (me);
if (Note_head::has_interface (n))
{
SCM sshorten = me->get_property ("stem-shorten");
SCM scm_shorten = scm_is_pair (sshorten)
- ? robust_list_ref ((duration_log (me) - 2) >? 0, sshorten) : SCM_EOL;
+ ? robust_list_ref (max (duration_log (me) - 2, 0), sshorten) : SCM_EOL;
Real shorten = 2* robust_scm2double (scm_shorten, 0);
/* On boundary: shorten only half */
}
/* Tremolo stuff. */
- Grob *t_flag = unsmob_grob (me->get_property ("tremolo-flag"));
- if (t_flag && !unsmob_grob (me->get_property ("beam")))
+ Grob *t_flag = unsmob_grob (me->get_object ("tremolo-flag"));
+ if (t_flag && !unsmob_grob (me->get_object ("beam")))
{
/* Crude hack: add extra space if tremolo flag is there.
if (dir == DOWN)
minlen -= 1.0;
}
- length = length >? (minlen + 1.0);
+ length = max (length, minlen + 1.0);
}
Real st = dir ? hp[dir] + dir * length : 0;
if (!head_count (me))
return;
- Link_array<Grob> heads
- = extract_grob_array (me, ly_symbol2scm ("note-heads"));
-
+ extract_grob_set (me, "note-heads", ro_heads);
+ Link_array<Grob> heads (ro_heads);
heads.sort (compare_position);
Direction dir = get_direction (me);
SCM
Stem::width_callback (SCM e, SCM ax)
{
- Axis a = (Axis) scm_to_int (ax);
- assert (a == X_AXIS);
+ (void) ax;
+ assert (scm_to_int (ax) == X_AXIS);
Grob *me = unsmob_grob (e);
Interval r;
{
r.set_empty ();
}
- else if (unsmob_grob (me->get_property ("beam")) || abs (duration_log (me)) <= 2)
+ else if (unsmob_grob (me->get_object ("beam")) || abs (duration_log (me)) <= 2)
{
r = Interval (-1, 1);
r *= thickness (me) / 2;
y2 -= d
* (0.5 * beam_thickness
- + beam_translation * (0 >? (beam_count - 1))
+ + beam_translation * max (0, (beam_count - 1))
+ stemlet_length) / half_space;
}
- Interval stem_y (y1 <? y2, y2 >? y1);
+ Interval stem_y (min (y1, y2), max (y2, y1));
if (Grob *hed = support_head (me))
{
}
else
{
- SCM rests = me->get_property ("rests");
- if (scm_is_pair (rests))
+ extract_grob_set (me, "rests", rests);
+ if (rests.size ())
{
- Grob *rest = unsmob_grob (scm_car (rests));
+ Grob *rest = rests.top ();
r = rest->extent (rest, X_AXIS).center ();
}
}
Spanner *
Stem::get_beam (Grob *me)
{
- SCM b = me->get_property ("beam");
+ SCM b = me->get_object ("beam");
return dynamic_cast<Spanner *> (unsmob_grob (b));
}
/* stem only extends to center of beam */
- 0.5 * beam_thickness;
- ideal_length = ideal_length >? ideal_minimum_length;
+ ideal_length = max (ideal_length, ideal_minimum_length);
/* Convert to Y position, calculate for dir == UP */
Real note_start
{
/* Highest beam of (UP) beam must never be lower than middle
staffline */
- ideal_y = ideal_y >? 0;
+ ideal_y = max (ideal_y, 0.0);
/* Lowest beam of (UP) beam must never be lower than second staffline */
- ideal_y = ideal_y >? (-staff_space
- - beam_thickness + height_of_my_beams);
+ ideal_y = max (ideal_y, (-staff_space
+ - beam_thickness + height_of_my_beams));
}
ideal_y -= robust_scm2double (beam->get_property ("shorten"), 0);
/* stem only extends to center of beam */
- 0.5 * beam_thickness;
- if (Grob *tremolo = unsmob_grob (me->get_property ("tremolo-flag")))
+ if (Grob *tremolo = unsmob_grob (me->get_object ("tremolo-flag")))
{
Interval y_ext = tremolo->extent (tremolo, Y_AXIS);
y_ext.widen (0.5); // FIXME. Should be tunable?
- minimum_length = minimum_length >? y_ext.length ();
+ minimum_length = max (minimum_length, y_ext.length ());
}
ideal_y *= my_dir;