static Grob *accidentals (Grob *me);
static Grob *arpeggio (Grob *me);
static Slice head_positions_interval (Grob *me);
- static void translate_rests (Grob *me, int dy);
static Grob *first_head (Grob *me);
static Grob *get_rest (Grob *me);
static void set_stem (Grob *me, Grob *);
static string glyph_name (Grob *, int, string, bool);
static SCM brew_internal_stencil (Grob*, bool);
static SCM generic_extent_callback (Grob*, Axis);
+ static void translate (Grob *me, int dy);
DECLARE_SCHEME_CALLBACK (polyphonic_offset_callback, (SCM));
DECLARE_SCHEME_CALLBACK (print, (SCM));
DECLARE_SCHEME_CALLBACK (width, (SCM));
Axis_group_interface::add_element (me, h);
}
-/**
- translate the rest symbols vertically by amount DY, but only if
- they have no staff-position set.
-*/
-void
-Note_column::translate_rests (Grob *me, int dy)
-{
- Grob *r = unsmob_grob (me->get_object ("rest"));
- if (r && !scm_is_number (r->get_property ("staff-position")))
- {
- r->translate_axis (dy * Staff_symbol_referencer::staff_space (r) / 2.0, Y_AXIS);
- Grob *p = r->get_parent (Y_AXIS);
- p->flush_extent_cache (Y_AXIS);
- }
-}
-
Grob *
Note_column::first_head (Grob *me)
{
}
}
+static bool
+rest_shift_less (Grob *const &r1, Grob *const &r2)
+{
+ Grob *col1 = r1->get_parent (X_AXIS);
+ Grob *col2 = r2->get_parent (X_AXIS);
+ return Note_column::shift_less (col1, col2);
+}
+
/*
TODO: look at horizontal-shift to determine ordering between rests
for more than two voices.
Direction d = get_grob_direction (r);
if (d)
- ordered_rests[d].push_back (rests[i]);
+ ordered_rests[d].push_back (r);
else
rests[d]->warning (_ ("cannot resolve rest collision: rest direction not set"));
}
Direction d = LEFT;
do
- vector_sort (ordered_rests[d], Note_column::shift_less);
+ vector_sort (ordered_rests[d], rest_shift_less);
while (flip (&d) != LEFT)
;
{
int amount_down = (int) ceil (diff / 2);
diff -= amount_down;
- Note_column::translate_rests (ordered_rests[DOWN].back (),
- -2 * amount_down);
+ Rest::translate (ordered_rests[DOWN].back (),
+ -2 * amount_down);
if (diff > 0)
- Note_column::translate_rests (ordered_rests[UP].back (),
- 2 * int (ceil (diff)));
+ Rest::translate (ordered_rests[UP].back (),
+ 2 * int (ceil (diff)));
}
do
{
- for (vsize i = ordered_rests[d].size () -1; i-- > 0;)
+ for (vsize i = ordered_rests[d].size () - 1; i-- > 0;)
{
Real last_y = ordered_rests[d][i + 1]->extent (common, Y_AXIS)[d];
Real y = ordered_rests[d][i]->extent (common, Y_AXIS)[-d];
Real diff = d * ((last_y - y) / staff_space);
if (diff > 0)
- Note_column::translate_rests (ordered_rests[d][i], d * (int) ceil (diff) * 2);
+ Rest::translate (ordered_rests[d][i], d * (int) ceil (diff) * 2);
}
}
while (flip (&d) != LEFT);
discrete_y = dir * int (ceil (dir * discrete_y / 2.0) * 2.0);
}
- Note_column::translate_rests (rcol, discrete_y);
+ Rest::translate (rest, discrete_y);
}
return SCM_BOOL_T;
}
return out.smobbed_copy ();
}
+/**
+ translate the rest vertically by amount DY, but only if
+ it doesn't have staff-position set.
+*/
+void
+Rest::translate (Grob *me, int dy)
+{
+ if (!scm_is_number (me->get_property ("staff-position")))
+ {
+ me->translate_axis (dy * Staff_symbol_referencer::staff_space (me) / 2.0, Y_AXIS);
+ Grob *p = me->get_parent (Y_AXIS);
+ p->flush_extent_cache (Y_AXIS);
+ }
+}
+
SCM
Rest::print (SCM smob)
{