X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fstaff-symbol.cc;h=6ae66d85c1880bb0dd817c70389abc43aff262a5;hb=47db9a3883d726ca53e2133a3b2298f78dd6a32e;hp=57279033b24c92020cdfba6344464feadd09c6c2;hpb=3d8f4559228bd8a4a30bb024163b64d425b76f18;p=lilypond.git diff --git a/lily/staff-symbol.cc b/lily/staff-symbol.cc index 57279033b2..6ae66d85c1 100644 --- a/lily/staff-symbol.cc +++ b/lily/staff-symbol.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2012 Han-Wen Nienhuys + Copyright (C) 1997--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -33,7 +33,7 @@ MAKE_SCHEME_CALLBACK (Staff_symbol, print, 1); SCM Staff_symbol::print (SCM smob) { - Grob *me = unsmob_grob (smob); + Grob *me = Grob::unsmob (smob); Spanner *sp = dynamic_cast (me); Grob *common = sp->get_bound (LEFT)->common_refpoint (sp->get_bound (RIGHT), X_AXIS); @@ -50,8 +50,7 @@ Staff_symbol::print (SCM smob) Real t = me->layout ()->get_dimension (ly_symbol2scm ("line-thickness")); t *= robust_scm2double (me->get_property ("thickness"), 1.0); - Direction d = LEFT; - do + for (LEFT_and_RIGHT (d)) { SCM width_scm = me->get_property ("width"); if (d == RIGHT && scm_is_number (width_scm)) @@ -66,16 +65,23 @@ Staff_symbol::print (SCM smob) else { Item *x = sp->get_bound (d); - - span_points[d] = ((!x->break_status_dir () - && !x->extent (x, X_AXIS).is_empty ()) - ? Paper_column::break_align_width (x, ly_symbol2scm ("break-alignment"))[d] - : x->relative_coordinate (common, X_AXIS)); + if (x->extent (x, X_AXIS).is_empty () + || (x->break_status_dir () && sp->broken_neighbor (d))) + span_points[d] = x->relative_coordinate (common, X_AXIS); + // What the default implementation of to-barline does for + // spanners is not really in usefully recognizable shape by + // now, so we just reimplement. + else + { + SCM where = (d == RIGHT + ? me->get_property ("break-align-symbols") + : ly_symbol2scm ("break-alignment")); + span_points[d] = Paper_column::break_align_width (x, where)[d]; + } } span_points[d] -= d * t / 2; } - while (flip (&d) != LEFT); Stencil m; @@ -88,7 +94,7 @@ Staff_symbol::print (SCM smob) Real space = staff_space (me); for (vector::const_iterator i = line_positions.begin (), - e = line_positions.end (); + e = line_positions.end (); i != e; ++i) { @@ -143,7 +149,7 @@ Staff_symbol::ledger_positions (Grob *me, int pos) Real nearest_line = line_positions[0]; Real line_dist = abs (line_positions[0] - pos); for (vector::const_iterator i = line_positions.begin (), - e = line_positions.end (); + e = line_positions.end (); i != e; ++i) { @@ -257,7 +263,9 @@ Staff_symbol::line_count (Grob *me) Real Staff_symbol::staff_space (Grob *me) { - return robust_scm2double (me->get_property ("staff-space"), 1.0); + Real ss = me->layout ()->get_dimension (ly_symbol2scm ("staff-space")); + + return robust_scm2double (me->get_property ("staff-space"), 1.0) * ss; } Real @@ -281,7 +289,7 @@ MAKE_SCHEME_CALLBACK (Staff_symbol, height, 1); SCM Staff_symbol::height (SCM smob) { - Grob *me = unsmob_grob (smob); + Grob *me = Grob::unsmob (smob); Real t = me->layout ()->get_dimension (ly_symbol2scm ("line-thickness")); t *= robust_scm2double (me->get_property ("thickness"), 1.0); @@ -374,6 +382,7 @@ ADD_INTERFACE (Staff_symbol, " @code{width} property.", /* properties */ + "break-align-symbols " "ledger-extra " "ledger-line-thickness " "ledger-positions "