2 system-start-delimiter.cc -- implement System_start_delimiter
4 source file of the GNU LilyPond music typesetter
6 (c) 2000 Han-Wen Nienhuys <hanwen@cs.uu.nl>
11 #include "axis-group-interface.hh"
12 #include "system-start-delimiter.hh"
13 #include "paper-def.hh"
14 #include "molecule.hh"
16 #include "all-font-metrics.hh"
17 #include "score-element.hh"
20 System_start_delimiter::staff_bracket (Score_element
*me
,Real height
)
22 Paper_def
* p
= me
->paper_l ();
23 SCM scmss
= p
->get_scmvar ("staffspace");
24 Real ss
= gh_scm2double (scmss
);
25 Real arc_height
= gh_scm2double (me
->get_elt_property("arch-height")) * ss
;
27 SCM at
= gh_list (ly_symbol2scm ("bracket"),
28 scm_product (me
->get_elt_property ("arch-angle"), scmss
),
29 scm_product (me
->get_elt_property ("arch-width"), scmss
),
30 gh_double2scm (arc_height
),
31 scm_product (me
->get_elt_property ("bracket-width"),scmss
),
32 gh_double2scm (height
),
33 scm_product (me
->get_elt_property ("arch-thick"),scmss
),
34 scm_product (me
->get_elt_property ("bracket-thick"),scmss
),
37 Real h
= height
+ 2 * arc_height
;
38 Box
b (Interval (0, 1.5 * ss
), Interval (-h
/2, h
/2));
40 mol
.align_to (X_AXIS
, CENTER
);
45 System_start_delimiter::set_interface (Score_element
*me
)
47 me
->set_extent_callback (0, Y_AXIS
);
48 Pointer_group_interface (me
).set_interface();
49 me
->set_interface (ly_symbol2scm ("system-start-delimiter-interface"));
53 System_start_delimiter::has_interface (Score_element
*me
)
55 return me
->has_interface (ly_symbol2scm ("system-start-delimiter-interface"));
59 System_start_delimiter::simple_bar (Score_element
*me
,Real h
)
61 Real w
= me
->paper_l ()->get_var ("stafflinethickness") *
62 gh_scm2double (me
->get_elt_property ("thickness"));
63 return me
->lookup_l ()->filledbox (Box (Interval(0,w
), Interval(-h
/2, h
/2)));
66 MAKE_SCHEME_CALLBACK(System_start_delimiter
,after_line_breaking
);
69 System_start_delimiter::after_line_breaking (SCM smob
)
71 try_collapse (unsmob_element (smob
));
72 return SCM_UNSPECIFIED
;
76 System_start_delimiter::try_collapse (Score_element
*me
)
78 SCM gl
= me
->get_elt_property ("glyph");
80 if (scm_ilength (me
->get_elt_property ("elements")) <= 1 && gl
== ly_symbol2scm ("bar-line"))
88 MAKE_SCHEME_CALLBACK(System_start_delimiter
,brew_molecule
);
91 System_start_delimiter::brew_molecule (SCM smob
)
93 Score_element
* me
= unsmob_element (smob
);
94 Interval ext
= Axis_group_interface::group_extent_callback (me
, Y_AXIS
);
95 Real l
= ext
.length ();
98 SCM s
= me
->get_elt_property ("collapse-height");
99 if (gh_number_p (s
) && l
< gh_scm2double (s
))
105 s
= me
->get_elt_property ("glyph");
109 if (s
== ly_symbol2scm ("bracket"))
110 m
= staff_bracket (me
,l
);
111 else if (s
== ly_symbol2scm ("brace"))
112 m
= staff_brace (me
,l
);
113 else if (s
== ly_symbol2scm ("bar-line"))
114 m
= simple_bar (me
,l
);
117 m
.translate_axis (ext
.center (), Y_AXIS
);
118 return m
.create_scheme ();
125 System_start_delimiter::staff_brace (Score_element
*me
,Real y
)
127 Real staffht
= me
->paper_l ()->get_var ("staffheight");
128 int staff_size
= int (rint (staffht
));
132 int minht
= 2 * staff_size
;
133 int maxht
= 7 * minht
;
134 int idx
= int (((maxht
- step
) <? y
- minht
) / step
);
137 SCM l
= scm_assoc (ly_str02scm ("brace"),
138 scm_eval (ly_symbol2scm ("cmr-alist")));
140 String nm
= "feta-braces";
142 nm
= ly_scm2string (gh_cdr (l
));
143 nm
+= to_str (staff_size
);
144 SCM e
=gh_list (ly_symbol2scm ("char"), gh_int2scm (idx
), SCM_UNDEFINED
);
147 at
= fontify_atom (find_font (nm
), at
);
149 Box
b (Interval (0,0), Interval (-y
/2, y
/2));
151 return Molecule(b
, at
);