2 rest.cc -- implement Rest
4 source file of the GNU LilyPond music typesetter
6 (c) 1997--2002 Han-Wen Nienhuys <hanwen@cs.uu.nl>
10 #include "paper-def.hh"
11 #include "font-interface.hh"
14 #include "paper-score.hh"
15 #include "staff-symbol-referencer.hh"
18 MAKE_SCHEME_CALLBACK (Rest,after_line_breaking,1);
20 Rest::after_line_breaking (SCM smob)
22 Grob *me = unsmob_grob (smob);
23 int bt = gh_scm2int (me->get_grob_property ("duration-log"));
24 int lc = Staff_symbol_referencer::line_count (me);
25 Real ss = Staff_symbol_referencer::staff_space (me);
28 if (bt == 0 && lc > 1)
30 me->translate_axis (ss , Y_AXIS);
35 me->translate_axis (ss/2 , Y_AXIS);
38 Grob * d = unsmob_grob (me->get_grob_property ("dot"));
39 if (d && bt > 4) // UGH.
41 d->set_grob_property ("staff-position",
42 gh_int2scm ((bt == 7) ? 4 : 3));
44 if (d && bt >= -1 && bt <= 1) // UGH again.
46 d->set_grob_property ("staff-position",
47 gh_int2scm ((bt == 0) ? -1 : 1));
49 return SCM_UNSPECIFIED;
53 make this function easily usable in C++
56 Rest::glyph_name (Grob *me, int balltype, String style)
58 bool ledgered_b = false;
60 if (balltype == 0 || balltype == 1)
62 Real rad = Staff_symbol_referencer::staff_radius (me) * 2.0;
63 Real pos = Staff_symbol_referencer::get_position (me);
66 Figure out when the rest is far enough outside the staff. This
67 could bemore generic, but hey, we understand this even after
70 ledgered_b |= (balltype == 0) && (pos >= +rad + 2 || pos < -rad);
71 ledgered_b |= (balltype == 1) && (pos <= -rad - 2 || pos > +rad);
74 String actual_style (style.to_str0 ());
76 if ((style == "mensural") || (style == "neo_mensural")) {
79 FIXME: Currently, ancient font does not provide ledgered rests;
80 hence the "o" suffix in the glyph name is bogus. But do we need
81 ledgered rests at all now that we can draw ledger lines with
82 variable width, length and blotdiameter? -- jr
87 There are no 32th/64th/128th mensural/neo_mensural rests. In
88 these cases, revert back to default style.
94 if ((style == "classical") && (balltype != 2)) {
96 classical style: revert back to default style for any rest other
102 if (style == "default") {
104 Some parts of lily still prefer style "default" over "".
105 Correct this here. -- jr
110 return ("rests-") + to_string (balltype) + (ledgered_b ? "o" : "") + actual_style;
114 MAKE_SCHEME_CALLBACK (Rest,brew_molecule,1);
117 Rest::brew_internal_molecule (SCM smob)
119 Grob* me = unsmob_grob (smob);
121 SCM balltype_scm = me->get_grob_property ("duration-log");
122 if (!gh_number_p (balltype_scm))
123 return Molecule ().smobbed_copy ();
125 int balltype = gh_scm2int (balltype_scm);
128 SCM style_scm = me->get_grob_property ("style");
129 if (gh_symbol_p (style_scm))
131 style = ly_scm2string (scm_symbol_to_string (style_scm));
134 Font_metric *fm = Font_interface::get_default_font (me);
135 String font_char = glyph_name (me, balltype, style);
136 Molecule out = fm->find_by_name (font_char);
139 me->warning (_f ("rest `%s' not found, ", font_char.to_str0 ()));
142 return out.smobbed_copy();
146 Rest::brew_molecule (SCM smob)
148 return brew_internal_molecule (smob);
150 MAKE_SCHEME_CALLBACK (Rest,extent_callback,2);
152 We need the callback. The real molecule has ledgers depending on
153 Y-position. The Y-position is known only after line breaking. */
155 Rest::extent_callback (SCM smob, SCM ax)
157 Axis a = (Axis) gh_scm2int (ax);
158 SCM m = brew_internal_molecule (smob);
159 return ly_interval2scm (unsmob_molecule (m)->extent (a));
164 ADD_INTERFACE (Rest,"rest-interface",
166 "style minimum-beam-collision-distance");