+MAKE_SCHEME_CALLBACK (Rest, print, 1);
+
+SCM
+Rest::brew_internal_stencil (SCM smob, bool ledgered)
+{
+ Grob *me = unsmob_grob (smob);
+
+ SCM balltype_scm = me->get_property ("duration-log");
+ if (!scm_is_number (balltype_scm))
+ return Stencil ().smobbed_copy ();
+
+ int balltype = scm_to_int (balltype_scm);
+
+ String style;
+ SCM style_scm = me->get_property ("style");
+ if (scm_is_symbol (style_scm))
+ style = ly_scm2string (scm_symbol_to_string (style_scm));
+
+ Font_metric *fm = Font_interface::get_default_font (me);
+ String font_char = glyph_name (me, balltype, style, ledgered);
+ Stencil out = fm->find_by_name (font_char);
+ if (out.is_empty ())
+ me->warning (_f ("rest `%s' not found", font_char.to_str0 ()));
+
+ return out.smobbed_copy ();
+}
+
+SCM
+Rest::print (SCM smob)
+{
+ return brew_internal_stencil (smob, true);
+}
+
+MAKE_SCHEME_CALLBACK (Rest, extent_callback, 2);
+/*
+ We need the callback. The real stencil has ledgers depending on
+ Y-position. The Y-position is known only after line breaking. */
+SCM
+Rest::extent_callback (SCM smob, SCM ax)
+{
+ Axis a = (Axis) scm_to_int (ax);
+
+ /*
+ Don't want ledgers: ledgers depend on Y position, which depends on
+ rest collision, which depends on stem size which depends on beam
+ slop of opposite note column.
+
+ consequence: we get too small extents and potential collisions
+ with ledgered rests.
+ */
+ SCM m = brew_internal_stencil (smob, a != X_AXIS);
+ return ly_interval2scm (unsmob_stencil (m)->extent (a));
+}
+
+MAKE_SCHEME_CALLBACK (Rest, polyphonic_offset_callback, 2);
+SCM
+Rest::polyphonic_offset_callback (SCM smob, SCM)
+{
+ Grob *me = unsmob_grob (smob);
+ if (scm_is_number (me->get_property ("staff-position")))
+ return scm_from_double (0);
+
+ Direction d = get_grob_direction (me);
+ Real off = 2 * d;
+ if (off)
+ off *= Staff_symbol_referencer::staff_space (me);
+
+ return scm_from_double (off);
+}