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 "system-start-delimiter.hh"
12 #include "paper-def.hh"
13 #include "molecule.hh"
14 #include "axis-group-interface.hh"
16 #include "all-font-metrics.hh"
19 System_start_delimiter::staff_bracket (Real height) const
21 Paper_def* p= paper_l ();
22 Real arc_height = p->get_var("bracket_arch_height");
23 SCM at = gh_list (ly_symbol2scm ("bracket"),
24 gh_double2scm (p->get_var("bracket_arch_angle")),
25 gh_double2scm (p->get_var("bracket_arch_width")),
26 gh_double2scm (arc_height),
27 gh_double2scm (p->get_var("bracket_width")),
28 gh_double2scm (height),
29 gh_double2scm (p->get_var("bracket_arch_thick")),
30 gh_double2scm (p->get_var("bracket_thick")),
33 Real staff_space = p->get_var ("interline");
34 Real h = height + 2 * arc_height;
35 Box b (Interval (0, 1.5 * staff_space), Interval (-h/2, h/2));
37 mol.align_to (X_AXIS, CENTER);
41 System_start_delimiter::System_start_delimiter ()
43 set_extent_callback (0, Y_AXIS);
44 Pointer_group_interface (this).set_interface();
48 System_start_delimiter::simple_bar (Real h) const
50 Real w = paper_l ()->get_var ("barthick_score");
51 return lookup_l ()->filledbox (Box (Interval(0,w), Interval(-h/2, h/2)));
55 System_start_delimiter::after_line_breaking ()
57 SCM gl = get_elt_property ("glyph");
59 if (scm_ilength (get_elt_pointer ("elements")) <= 1 && gl == ly_symbol2scm ("bar-line"))
61 set_elt_property ("transparent", SCM_BOOL_T);
62 set_extent_callback (0, X_AXIS);
63 set_extent_callback (0, Y_AXIS);
68 System_start_delimiter::do_brew_molecule ()const
70 Interval ext = Axis_group_interface::group_extent_callback (this, Y_AXIS);
71 Real l = ext.length ();
74 SCM s = get_elt_property ("collapse-height");
75 if (gh_number_p (s) && l < gh_scm2double (s))
77 System_start_delimiter * me = (System_start_delimiter*)this;
78 me->set_elt_property ("transparent", SCM_BOOL_T);
79 me->set_extent_callback (0, X_AXIS);
80 me->set_extent_callback (0, Y_AXIS);
85 s = get_elt_property ("glyph");
89 if (s == ly_symbol2scm ("bracket"))
90 m = staff_bracket (l);
91 else if ( s == ly_symbol2scm ("brace"))
93 else if (s == ly_symbol2scm ("bar-line"))
97 m.translate_axis (ext.center (), Y_AXIS);
105 System_start_delimiter::staff_brace (Real y) const
107 Real staffht = paper_l ()->get_var ("staffheight");
108 int staff_size = int (rint (staffht ));
112 int minht = 2 * staff_size;
113 int maxht = 7 * minht;
114 int idx = int (((maxht - step) <? y - minht) / step);
117 SCM l = scm_eval (gh_list (ly_symbol2scm ("style-to-cmr"),
118 ly_str02scm ("brace"),
121 String nm = "feta-braces";
123 nm = ly_scm2string (gh_cdr (l));
124 nm += to_str (staff_size);
125 SCM e =gh_list (ly_symbol2scm ("char"), gh_int2scm (idx), SCM_UNDEFINED);
128 at = fontify_atom (find_font (nm), at);
130 Box b (Interval (0,0), Interval (-y/2, y/2));
132 return Molecule(b, at);