X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Frest.cc;h=2ceffafb5a119a26a8ed4828f53dc4073bcde326;hb=83c0409957c5ff1f35ef918455a7156fd550fa61;hp=a7475e452e2c4b7bba4ba0e2a56c0160f63275c4;hpb=eec76aa84a3e17ac58893e2d06f967debc1f74a9;p=lilypond.git diff --git a/lily/rest.cc b/lily/rest.cc index a7475e452e..2ceffafb5a 100644 --- a/lily/rest.cc +++ b/lily/rest.cc @@ -7,7 +7,7 @@ */ #include "stencil.hh" -#include "paper-def.hh" +#include "output-def.hh" #include "font-interface.hh" #include "rest.hh" #include "dots.hh" @@ -21,10 +21,10 @@ SCM Rest::after_line_breaking (SCM smob) { Grob *me = unsmob_grob (smob); - int bt = gh_scm2int (me->get_property ("duration-log")); + int bt = ly_scm2int (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) { @@ -40,12 +40,12 @@ Rest::after_line_breaking (SCM smob) if (d && bt > 4) // UGH. { d->set_property ("staff-position", - gh_int2scm ((bt == 7) ? 4 : 3)); + scm_int2num ((bt == 7) ? 4 : 3)); } if (d && bt >= -1 && bt <= 1) // UGH again. { d->set_property ("staff-position", - gh_int2scm ((bt == 0) ? -1 : 1)); + scm_int2num ((bt == 0) ? -1 : 1)); } return SCM_UNSPECIFIED; } @@ -54,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); @@ -74,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; @@ -85,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) @@ -115,38 +114,34 @@ Rest::glyph_name (Grob *me, int balltype, String style) MAKE_SCHEME_CALLBACK (Rest,print,1); SCM -Rest::brew_internal_stencil (SCM smob) +Rest::brew_internal_stencil (SCM smob, bool ledgered) { Grob* me = unsmob_grob (smob); SCM balltype_scm = me->get_property ("duration-log"); - if (!gh_number_p (balltype_scm)) + if (!ly_c_number_p (balltype_scm)) return Stencil ().smobbed_copy (); - int balltype = gh_scm2int (balltype_scm); + int balltype = ly_scm2int (balltype_scm); String style; SCM style_scm = me->get_property ("style"); - if (gh_symbol_p (style_scm)) - { - style = ly_scm2string (scm_symbol_to_string (style_scm)); - } + 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); + 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_stencil (smob); + return brew_internal_stencil (smob, true); } MAKE_SCHEME_CALLBACK (Rest,extent_callback,2); /* @@ -155,8 +150,17 @@ MAKE_SCHEME_CALLBACK (Rest,extent_callback,2); SCM Rest::extent_callback (SCM smob, SCM ax) { - Axis a = (Axis) gh_scm2int (ax); - SCM m = brew_internal_stencil (smob); + Axis a = (Axis) ly_scm2int (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)); } @@ -165,17 +169,17 @@ SCM Rest::polyphonic_offset_callback (SCM smob, SCM) { Grob* me = unsmob_grob (smob); - if (gh_number_p (me->get_property ("staff-position"))) - return gh_double2scm (0); + 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) + if (off) off *= Staff_symbol_referencer::staff_space (me); - return gh_double2scm (off); + return scm_make_real (off); } ADD_INTERFACE (Rest,"rest-interface", "A rest symbol.", - "style minimum-distance"); + "style direction minimum-distance");