2 rest.cc -- implement Rest
4 source file of the GNU LilyPond music typesetter
6 (c) 1997--2006 Han-Wen Nienhuys <hanwen@xs4all.nl>
11 #include "directional-element-interface.hh"
13 #include "font-interface.hh"
14 #include "international.hh"
15 #include "output-def.hh"
16 #include "paper-score.hh"
17 #include "staff-symbol-referencer.hh"
22 MAKE_SCHEME_CALLBACK (Rest, y_offset_callback, 1);
24 Rest::y_offset_callback (SCM smob)
26 Grob *me = unsmob_grob (smob);
27 int duration_log = scm_to_int (me->get_property ("duration-log"));
28 int line_count = Staff_symbol_referencer::line_count (me);
29 Real ss = Staff_symbol_referencer::staff_space (me);
31 bool position_override = scm_is_number (me->get_property ("staff-position"));
32 Real amount = robust_scm2double (me->get_property ("staff-position"), 0)
37 if (duration_log == 0 && line_count > 1)
43 Grob *dot = unsmob_grob (me->get_object ("dot"));
44 if (dot && duration_log > 4) // UGH.
46 dot->set_property ("staff-position",
47 scm_from_int ((duration_log == 7) ? 4 : 3));
49 if (dot && duration_log >= -1 && duration_log <= 1) // UGH again.
51 dot->set_property ("staff-position",
52 scm_from_int ((duration_log == 0) ? -1 : 1));
55 if (!position_override)
56 amount += 2 * ss * get_grob_direction (me);;
58 return scm_from_double (amount);
62 make this function easily usable in C++
65 Rest::glyph_name (Grob *me, int balltype, string style, bool try_ledgers)
67 bool is_ledgered = false;
68 if (try_ledgers && (balltype == 0 || balltype == 1))
70 Real rad = Staff_symbol_referencer::staff_radius (me) * 2.0;
71 Real pos = Staff_symbol_referencer::get_position (me);
74 Figure out when the rest is far enough outside the staff. This
75 could bemore generic, but hey, we understand this even after
78 is_ledgered |= (balltype == 0) && (pos >= +rad + 2 || pos < -rad);
79 is_ledgered |= (balltype == 1) && (pos <= -rad - 2 || pos > +rad);
82 string actual_style (style.c_str ());
84 if ((style == "mensural") || (style == "neomensural"))
88 FIXME: Currently, ancient font does not provide ledgered rests;
89 hence the "o" suffix in the glyph name is bogus. But do we need
90 ledgered rests at all now that we can draw ledger lines with
91 variable width, length and blotdiameter? -- jr
96 There are no 32th/64th/128th mensural/neomensural rests. In
97 these cases, revert back to default style.
103 if ((style == "classical") && (balltype != 2))
106 classical style: revert back to default style for any rest other
112 if (style == "default")
115 Some parts of lily still prefer style "default" over "".
116 Correct this here. -- jr
121 return ("rests." + to_string (balltype) + (is_ledgered ? "o" : "")
125 MAKE_SCHEME_CALLBACK (Rest, print, 1);
127 Rest::brew_internal_stencil (Grob *me, bool ledgered)
129 SCM balltype_scm = me->get_property ("duration-log");
130 if (!scm_is_number (balltype_scm))
131 return Stencil ().smobbed_copy ();
133 int balltype = scm_to_int (balltype_scm);
136 SCM style_scm = me->get_property ("style");
137 if (scm_is_symbol (style_scm))
138 style = ly_scm2string (scm_symbol_to_string (style_scm));
140 Font_metric *fm = Font_interface::get_default_font (me);
141 string font_char = glyph_name (me, balltype, style, ledgered);
142 Stencil out = fm->find_by_name (font_char);
144 me->warning (_f ("rest `%s' not found", font_char.c_str ()));
146 return out.smobbed_copy ();
150 Rest::print (SCM smob)
152 return brew_internal_stencil (unsmob_grob (smob), true);
155 MAKE_SCHEME_CALLBACK (Rest, width, 1);
157 We need the callback. The real stencil has ledgers depending on
158 Y-position. The Y-position is known only after line breaking. */
160 Rest::width (SCM smob)
162 return generic_extent_callback (unsmob_grob (smob), X_AXIS);
165 MAKE_SCHEME_CALLBACK (Rest, height, 1);
167 Rest::height (SCM smob)
169 return generic_extent_callback (unsmob_grob (smob), Y_AXIS);
173 We need the callback. The real stencil has ledgers depending on
174 Y-position. The Y-position is known only after line breaking. */
176 Rest::generic_extent_callback (Grob *me, Axis a)
179 Don't want ledgers: ledgers depend on Y position, which depends on
180 rest collision, which depends on stem size which depends on beam
181 slop of opposite note column.
183 consequence: we get too small extents and potential collisions
186 SCM m = brew_internal_stencil (me, a != X_AXIS);
187 return ly_interval2scm (unsmob_stencil (m)->extent (a));