X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fbar.cc;h=4192fd0780b254741076798413283792eb10dab7;hb=acec5c037f53a163237c31486b84971aa33deaab;hp=cb956edf231d2ae475200eb4598db5f27bfd527f;hpb=9c8bcb9a2a1fedb5459e593b18a8c550318e6800;p=lilypond.git diff --git a/lily/bar.cc b/lily/bar.cc index cb956edf23..4192fd0780 100644 --- a/lily/bar.cc +++ b/lily/bar.cc @@ -7,6 +7,7 @@ */ #include +#include "paper-column.hh" #include "main.hh" #include "dimensions.hh" #include "score-element.hh" @@ -20,7 +21,7 @@ #include "item.hh" #include "staff-symbol-referencer.hh" -MAKE_SCHEME_CALLBACK(Bar,brew_molecule); +MAKE_SCHEME_CALLBACK(Bar,brew_molecule,1); SCM Bar::brew_molecule (SCM smob) @@ -33,7 +34,11 @@ Bar::brew_molecule (SCM smob) { String str =ly_scm2string (s); SCM siz = gh_call1 (barsiz_proc, me->self_scm ()); - return compound_barline (me, str, gh_scm2double (siz)).create_scheme (); + Real sz = gh_scm2double (siz); + if (sz < 0) + return SCM_EOL; + + return compound_barline (me, str, sz).create_scheme (); } return SCM_EOL; } @@ -64,10 +69,6 @@ Bar::compound_barline (Score_element*me, String str, Real h) { return me->lookup_l ()->blank (Box (Interval(0, 0), Interval (-h/2, h/2))); } - if (str == "scorepostbreak") - { - return simple_barline (me, me->paper_l ()->get_var ("barthick_score"), h); - } else if (str == "|") { return thin; @@ -122,7 +123,7 @@ Bar::simple_barline (Score_element*me,Real w, Real h) return me->lookup_l ()->filledbox (Box (Interval(0,w), Interval(-h/2, h/2))); } -MAKE_SCHEME_CALLBACK(Bar,before_line_breaking ); +MAKE_SCHEME_CALLBACK(Bar,before_line_breaking ,1); SCM Bar::before_line_breaking (SCM smob) @@ -133,50 +134,61 @@ Bar::before_line_breaking (SCM smob) SCM g = me->get_elt_property ("glyph"); SCM orig = g; Direction bsd = item->break_status_dir (); - if (gh_string_p (g)) + if (gh_string_p (g) && bsd) { - if (bsd) - { - SCM breakdir = gh_int2scm (bsd); - g = scm_eval (gh_list (ly_symbol2scm ("break-barline"), - g, - breakdir, - SCM_UNDEFINED)); - } - } - else - { - g = SCM_EOL; + SCM proc = me->get_elt_property ("break-glyph-function"); + g = gh_call2 (proc, g, gh_int2scm (bsd)); } + if (!gh_string_p (g)) { me->set_elt_property ("molecule-callback", SCM_BOOL_T); - me->set_extent_callback (0, X_AXIS); + me->set_extent_callback (SCM_EOL, X_AXIS); // leave y_extent for spanbar? } - else if (! gh_equal_p (g, orig)) + + if (! gh_equal_p (g, orig)) me->set_elt_property ("glyph", g); + + /* + set a (pseudo) stem-direction, so we extra space is inserted + between stemup and barline. + + TODO: should check if the barline is the leftmost object of the + break alignment. + */ + if (gh_string_p (g)) + { + Score_element * col = item->column_l (); + SCM dirlist = col->get_elt_property ("dir-list"); + SCM scmdir = gh_int2scm (-1); + if (scm_memq (scmdir, dirlist) == SCM_BOOL_F) + { + dirlist = gh_cons (scmdir, dirlist); + col->set_elt_property ("dir-list", dirlist); + } + } + return SCM_UNSPECIFIED; } void Bar::set_interface (Score_element*me) { - me->set_elt_property ("interfaces", - gh_cons (ly_symbol2scm ("bar-interface"), me->get_elt_property ("interfaces"))); + me->set_interface (ly_symbol2scm ("bar-line-interface")); } bool Bar::has_interface (Score_element*m) { - return m && m->has_interface (ly_symbol2scm ("bar-interface")); + return m && m->has_interface (ly_symbol2scm ("bar-line-interface")); } -MAKE_SCHEME_CALLBACK(Bar,get_staff_bar_size); +MAKE_SCHEME_CALLBACK(Bar,get_staff_bar_size,1); SCM Bar::get_staff_bar_size (SCM smob) {