X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fbar-line.cc;h=800c138c9362e2231ee570497e3245a4e8e5ee41;hb=ec8b80d1b75688aa875078a228fb0e6ec39d3ccb;hp=78012a55a1a5d6630416b327daa2c5ecc71fa20e;hpb=c3ff1c6cd20e15e9036ee7120012e05b1d62a46d;p=lilypond.git diff --git a/lily/bar-line.cc b/lily/bar-line.cc index 78012a55a1..800c138c93 100644 --- a/lily/bar-line.cc +++ b/lily/bar-line.cc @@ -16,6 +16,30 @@ #include "staff-symbol-referencer.hh" #include "line-interface.hh" +MAKE_SCHEME_CALLBACK (Bar_line, calc_bar_extent, 1) +SCM +Bar_line::calc_bar_extent (SCM smob) +{ + Grob *me = unsmob_grob (smob); + + SCM size = me->get_property ("bar-size"); + + if (!scm_is_number (size)) + return ly_interval2scm (Interval ()); + + Real h = scm_to_double (size); + return ly_interval2scm (Interval (-h/2, h/2)); +} + +Interval +Bar_line::bar_y_extent (Grob *me, Grob *refpoint) +{ + Interval iv = robust_scm2interval (me->get_property ("bar-extent"), Interval ()); + + iv.translate (me->relative_coordinate (refpoint, Y_AXIS)); + return iv; +} + MAKE_SCHEME_CALLBACK (Bar_line, print, 1); SCM Bar_line::print (SCM smob) @@ -237,6 +261,33 @@ Bar_line::dashed_bar_line (Grob *me, Real h, Real thick) return Stencil (); } +MAKE_SCHEME_CALLBACK (Bar_line, calc_anchor, 1) +SCM +Bar_line::calc_anchor (SCM smob) +{ + Grob *me = unsmob_grob (smob); + Real kern = robust_scm2double (me->get_property ("kern"), 1); + Real staffline = me->layout ()->get_dimension (ly_symbol2scm ("line-thickness")); + string str = robust_scm2string (me->get_property ("glyph-name"), ""); + + /* we put the anchor in the center of the barline, unless we are + a repeat bar, in which case we put the anchor in the center of + the barline without the dots. */ + Interval ext = me->extent (me, X_AXIS); + if (ext.is_empty ()) + return scm_from_double (0); + + Real anchor = ext.center (); + + Stencil dot = Font_interface::get_default_font (me)->find_by_name ("dots.dot"); + Real dot_width = dot.extent (X_AXIS).length () + kern * staffline; + if (str == "|:") + anchor -= dot_width / 2; + else if (str == ":|") + anchor += dot_width / 2; + + return scm_from_double (anchor); +} ADD_INTERFACE (Bar_line, @@ -265,6 +316,7 @@ ADD_INTERFACE (Bar_line, /* properties */ + "allow-span-bar " "gap " "kern " "thin-kern " @@ -273,6 +325,7 @@ ADD_INTERFACE (Bar_line, "glyph " "glyph-name " "bar-size " + "bar-extent " );