lilypond-1.5.10
[lilypond.git] / lily / staff-symbol.cc
blobcbb5784ab188cd1333c2b244f76a7517e6e3043c
1 /*
2 staff-symbol.cc -- implement Staff_symbol
4 source file of the GNU LilyPond music typesetter
6 (c) 1997--2001 Han-Wen Nienhuys <hanwen@cs.uu.nl>
7 */
9 #include "lookup.hh"
10 #include "dimensions.hh"
11 #include "paper-def.hh"
12 #include "molecule.hh"
13 #include "debug.hh"
14 #include "item.hh"
15 #include "staff-symbol.hh"
16 #include "spanner.hh"
20 MAKE_SCHEME_CALLBACK (Staff_symbol,brew_molecule,1);
22 SCM
23 Staff_symbol::brew_molecule (SCM smob)
25 Grob *me = unsmob_grob (smob);
26 Spanner* sp = dynamic_cast<Spanner*> (me);
27 Grob * common
28 = sp->get_bound (LEFT)->common_refpoint (sp->get_bound (RIGHT), X_AXIS);
30 Real width =
31 // right_shift - left_shift
32 + sp->get_bound (RIGHT)->relative_coordinate (common , X_AXIS)
33 - sp->get_bound (LEFT)->relative_coordinate (common, X_AXIS)
36 Real t = me->paper_l ()->get_var ("stafflinethickness");
37 int l = Staff_symbol::line_count (me);
39 Real height = (l-1) * staff_space (me) /2;
40 Molecule m;
41 for (int i=0; i < l; i++)
43 Molecule a =
44 Lookup::filledbox (Box (Interval (0,width),
45 Interval (-t/2, t/2)));
47 a.translate_axis (height - i * staff_space (me), Y_AXIS);
48 m.add_molecule (a);
51 return m.smobbed_copy ();
54 int
55 Staff_symbol::steps_i (Grob*me)
57 return line_count (me) * 2;
60 int
61 Staff_symbol::line_count (Grob*me)
63 SCM c = me->get_grob_property ("line-count");
64 if (gh_number_p (c))
65 return gh_scm2int (c);
66 else
67 return 0;
70 Real
71 Staff_symbol::staff_space (Grob*me)
73 Real ss = 1.0;
75 SCM s = me->get_grob_property ("staff-space");
76 if (gh_number_p (s))
77 ss *= gh_scm2double (s);
78 return ss;
81 bool
82 Staff_symbol::has_interface (Grob*m)
84 return m && m->has_interface (ly_symbol2scm ("staff-symbol-interface"));