X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Frest.cc;h=e1e7313dab2823a033ba8f201051c55e6f462a01;hb=e53b6ddc057f5419b4bc6219f0cf6132a487a305;hp=210e756814bbf7c9cdf8c215ac8142db71d60563;hpb=05fabaaf86fd44f9bd903f282bb98d343a991e40;p=lilypond.git diff --git a/lily/rest.cc b/lily/rest.cc index 210e756814..e1e7313dab 100644 --- a/lily/rest.cc +++ b/lily/rest.cc @@ -6,13 +6,14 @@ (c) 1997--2004 Han-Wen Nienhuys */ -#include "molecule.hh" -#include "paper-def.hh" +#include "stencil.hh" +#include "output-def.hh" #include "font-interface.hh" #include "rest.hh" #include "dots.hh" #include "paper-score.hh" #include "staff-symbol-referencer.hh" +#include "directional-element-interface.hh" // -> offset callback MAKE_SCHEME_CALLBACK (Rest,after_line_breaking,1); @@ -20,10 +21,10 @@ SCM Rest::after_line_breaking (SCM smob) { Grob *me = unsmob_grob (smob); - int bt = gh_scm2int (me->get_grob_property ("duration-log")); + int bt = scm_to_int (me->get_property ("duration-log")); int lc = Staff_symbol_referencer::line_count (me); Real ss = Staff_symbol_referencer::staff_space (me); - if(lc % 2) + if (lc % 2) { if (bt == 0 && lc > 1) { @@ -35,16 +36,16 @@ Rest::after_line_breaking (SCM smob) me->translate_axis (ss/2 , Y_AXIS); } - Grob * d = unsmob_grob (me->get_grob_property ("dot")); + Grob * d = unsmob_grob (me->get_property ("dot")); if (d && bt > 4) // UGH. { - d->set_grob_property ("staff-position", - gh_int2scm ((bt == 7) ? 4 : 3)); + d->set_property ("staff-position", + scm_int2num ((bt == 7) ? 4 : 3)); } if (d && bt >= -1 && bt <= 1) // UGH again. { - d->set_grob_property ("staff-position", - gh_int2scm ((bt == 0) ? -1 : 1)); + d->set_property ("staff-position", + scm_int2num ((bt == 0) ? -1 : 1)); } return SCM_UNSPECIFIED; } @@ -53,11 +54,10 @@ Rest::after_line_breaking (SCM smob) make this function easily usable in C++ */ String -Rest::glyph_name (Grob *me, int balltype, String style) +Rest::glyph_name (Grob *me, int balltype, String style, bool try_ledgers) { bool ledgered_b = false; - - if (balltype == 0 || balltype == 1) + if (try_ledgers && (balltype == 0 || balltype == 1)) { Real rad = Staff_symbol_referencer::staff_radius (me) * 2.0; Real pos = Staff_symbol_referencer::get_position (me); @@ -73,7 +73,7 @@ Rest::glyph_name (Grob *me, int balltype, String style) String actual_style (style.to_str0 ()); - if ((style == "mensural") || (style == "neo_mensural")) { + if ((style == "mensural") || (style == "neomensural")) { /* FIXME: Currently, ancient font does not provide ledgered rests; @@ -84,7 +84,7 @@ Rest::glyph_name (Grob *me, int balltype, String style) ledgered_b = 0; /* - There are no 32th/64th/128th mensural/neo_mensural rests. In + There are no 32th/64th/128th mensural/neomensural rests. In these cases, revert back to default style. */ if (balltype > 4) @@ -114,54 +114,72 @@ Rest::glyph_name (Grob *me, int balltype, String style) MAKE_SCHEME_CALLBACK (Rest,print,1); SCM -Rest::brew_internal_molecule (SCM smob) +Rest::brew_internal_stencil (SCM smob, bool ledgered) { Grob* me = unsmob_grob (smob); - SCM balltype_scm = me->get_grob_property ("duration-log"); - if (!gh_number_p (balltype_scm)) - return Molecule ().smobbed_copy (); + SCM balltype_scm = me->get_property ("duration-log"); + if (!ly_c_number_p (balltype_scm)) + return Stencil ().smobbed_copy (); - int balltype = gh_scm2int (balltype_scm); + int balltype = scm_to_int (balltype_scm); String style; - SCM style_scm = me->get_grob_property ("style"); - if (gh_symbol_p (style_scm)) - { - style = ly_scm2string (scm_symbol_to_string (style_scm)); - } + SCM style_scm = me->get_property ("style"); + if (ly_c_symbol_p (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); - Molecule out = fm->find_by_name (font_char); + 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 ())); - } + me->warning (_f ("rest `%s' not found", font_char.to_str0 ())); - return out.smobbed_copy(); + return out.smobbed_copy (); } SCM Rest::print (SCM smob) { - return brew_internal_molecule (smob); + return brew_internal_stencil (smob, true); } MAKE_SCHEME_CALLBACK (Rest,extent_callback,2); /* - We need the callback. The real molecule has ledgers depending on + 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) gh_scm2int (ax); - SCM m = brew_internal_molecule (smob); - return ly_interval2scm (unsmob_molecule (m)->extent (a)); + 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 (ly_c_number_p (me->get_property ("staff-position"))) + return scm_make_real (0); + + Direction d = get_grob_direction (me); + Real off = 2* d ; + if (off) + off *= Staff_symbol_referencer::staff_space (me); + return scm_make_real (off); +} ADD_INTERFACE (Rest,"rest-interface", - "a rest", - "style minimum-distance"); + "A rest symbol.", + "style direction minimum-distance");