X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fstaff-symbol.cc;h=53beacabb045a61e08c81b3f75024d8573f4e21f;hb=d7dc509525cc1f5b8b670e5d38db44a546674b86;hp=b791b707fd91feb4310321e66b4202e93f6a183c;hpb=b0064942493df77833e6e41e05d362850f4874b0;p=lilypond.git diff --git a/lily/staff-symbol.cc b/lily/staff-symbol.cc index b791b707fd..53beacabb0 100644 --- a/lily/staff-symbol.cc +++ b/lily/staff-symbol.cc @@ -1,71 +1,122 @@ /* - staffsym.cc -- implement Staff_symbol + staff-symbol.cc -- implement Staff_symbol source file of the GNU LilyPond music typesetter - (c) 1997--2000 Han-Wen Nienhuys + (c) 1997--2003 Han-Wen Nienhuys */ -#include "staff-symbol.hh" + #include "lookup.hh" #include "dimensions.hh" #include "paper-def.hh" #include "molecule.hh" -#include "debug.hh" +#include "warn.hh" #include "item.hh" +#include "staff-symbol.hh" +#include "staff-symbol-referencer.hh" +#include "spanner.hh" + +MAKE_SCHEME_CALLBACK (Staff_symbol,brew_molecule,1); -MAKE_SCHEME_SCORE_ELEMENT_CALLBACKS(Staff_symbol) -Molecule -Staff_symbol::do_brew_molecule () const +SCM +Staff_symbol::brew_molecule (SCM smob) { - Score_element * common - = get_bound (LEFT)->common_refpoint (get_bound (RIGHT), X_AXIS); + Grob *me = unsmob_grob (smob); + Spanner* sp = dynamic_cast (me); + Grob * common + = sp->get_bound (LEFT)->common_refpoint (sp->get_bound (RIGHT), X_AXIS); - Real width = - // right_shift - left_shift - + get_bound (RIGHT)->relative_coordinate (common , X_AXIS) - - get_bound (LEFT)->relative_coordinate (common, X_AXIS) - ; - - Real t = paper_l ()->get_var ("stafflinethickness"); - int l = line_count (); + Real width = 0.0; + + /* + For raggedright without ragged staffs, simply set width to the linewidth. + + (ok -- lousy UI, since width is in staff spaces) + + --hwn. + */ + SCM width_scm = me->get_grob_property ("width"); + if (gh_number_p (width_scm)) + { + + /* + don't multiply by Staff_symbol_referencer::staff_space (me), + since that would make aligning staff symbols of different sizes to + one right margin hell. + */ + width = gh_scm2double (width_scm); + } + else + { + width = sp->get_bound (RIGHT)->relative_coordinate (common , X_AXIS); + } + + // respect indentation, if any + width -= sp->get_bound (LEFT)->relative_coordinate (common, X_AXIS); + + if (width < 0) + { + warning (_f ("staff symbol: indentation yields beyond end of line")); + width = 0; + } + + Real t = me->get_paper ()->get_var ("linethickness"); + SCM my_thick = me->get_grob_property("thickness"); + if (gh_number_p (my_thick)) + t *= gh_scm2double (my_thick); + + int l = Staff_symbol::line_count (me); - Real height = (l-1) * staff_space () /2; - Molecule m; + Real height = (l-1) * staff_space (me) /2; + Molecule m; for (int i=0; i < l; i++) { Molecule a = - lookup_l ()->filledbox (Box (Interval (0,width), - Interval (-t/2, t/2))); + Lookup::horizontal_line (Interval (0,width), t); - a.translate_axis (height - i * staff_space (), Y_AXIS); + a.translate_axis (height - i * staff_space (me), Y_AXIS); m.add_molecule (a); } - return m; + return m.smobbed_copy (); } int -Staff_symbol::steps_i() const +Staff_symbol::get_steps (Grob*me) { - return line_count () * 2; + return line_count (me) * 2; } int -Staff_symbol::line_count () const +Staff_symbol::line_count (Grob*me) { - return gh_scm2int (get_elt_property ("line-count")); + SCM c = me->get_grob_property ("line-count"); + if (gh_number_p (c)) + return gh_scm2int (c); + else + return 0; } Real -Staff_symbol::staff_space ()const +Staff_symbol::staff_space (Grob*me) { - return gh_scm2double (get_elt_property ("staff-space")) * - paper_l ()->get_var ("staffspace"); + Real ss = 1.0; + + SCM s = me->get_grob_property ("staff-space"); + if (gh_number_p (s)) + ss *= gh_scm2double (s); + return ss; } -Staff_symbol::Staff_symbol( SCM s) - : Spanner (s) -{ -} + + + +ADD_INTERFACE (Staff_symbol,"staff-symbol-interface", + "This spanner draws the lines of a staff. The center (i.e. middle line " +"or space) is position 0. The length of the symbol may be set by hand " +"through the @code{width} property. ", + + "width staff-space thickness line-count"); +