2 system-start-delimiter.cc -- implement System_start_delimiter
4 source file of the GNU LilyPond music typesetter
6 (c) 2000--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
9 #include "system-start-delimiter.hh"
10 #include "text-interface.hh"
11 #include "all-font-metrics.hh"
12 #include "axis-group-interface.hh"
13 #include "font-interface.hh"
15 #include "line-interface.hh"
17 #include "output-def.hh"
18 #include "pointer-group-interface.hh"
20 #include "staff-symbol-referencer.hh"
23 System_start_delimiter::staff_bracket (Grob
*me
, Real height
)
25 SCM fam
= scm_cons (ly_symbol2scm ("font-encoding"),
26 ly_symbol2scm ("fetaMusic"));
28 SCM alist
= scm_list_n (fam
, SCM_UNDEFINED
);
29 Font_metric
*fm
= select_font (me
->layout (), scm_list_n (alist
, SCM_UNDEFINED
));
31 Drul_array
<Stencil
> tips (fm
->find_by_name ("brackettips.down"),
32 fm
->find_by_name ("brackettips.up"));
34 Real thickness
= robust_scm2double (me
->get_property ("thickness"), 0.25);
36 Real overlap
= 0.1 * thickness
;
38 Box
box (Interval (0, thickness
),
40 * (height
/ 2 + overlap
));
42 Stencil bracket
= Lookup::filled_box (box
);
45 bracket
.add_at_edge (Y_AXIS
, d
, tips
[d
], -overlap
);
46 while (flip (&d
) != DOWN
);
47 bracket
= Stencil (box
, bracket
.expr ());
49 bracket
.translate_axis (-0.8, X_AXIS
);
55 System_start_delimiter::line_bracket (Grob
*me
, Real height
)
58 = me
->layout ()->get_dimension (ly_symbol2scm ("line-thickness"))
59 * robust_scm2double (me
->get_property ("thickness"), 1);
62 Stencil tip1
= Line_interface::make_line (thick
,
63 Offset (0, -height
/2),
64 Offset (w
, -height
/2));
65 Stencil tip2
= Line_interface::make_line (thick
,
67 Offset (w
, height
/2));
68 Stencil vline
= Line_interface::make_line (thick
,
69 Offset (0, -height
/2),
70 Offset (0, height
/2));
72 vline
.add_stencil (tip1
);
73 vline
.add_stencil (tip2
);
74 vline
.translate_axis (-w
, X_AXIS
);
79 System_start_delimiter::simple_bar (Grob
*me
, Real h
)
81 Real lt
= me
->layout ()->get_dimension (ly_symbol2scm ("line-thickness"));
82 Real w
= lt
* robust_scm2double (me
->get_property ("thickness"), 1);
83 return Lookup::round_filled_box (Box (Interval (0, w
), Interval (-h
/ 2, h
/ 2)),
87 MAKE_SCHEME_CALLBACK (System_start_delimiter
, print
, 1);
89 System_start_delimiter::print (SCM smob
)
91 Spanner
*me
= unsmob_spanner (smob
);
92 extract_grob_set (me
, "elements", elts
);
93 Grob
*common
= common_refpoint_of_array (elts
, me
, Y_AXIS
);
96 int non_empty_count
= 0;
97 for (vsize i
= elts
.size (); i
--;)
99 Spanner
*sp
= dynamic_cast<Spanner
*> (elts
[i
]);
102 && sp
->get_bound (LEFT
) == me
->get_bound (LEFT
))
104 Interval dims
= sp
->extent (common
, Y_AXIS
);
105 if (!dims
.is_empty ())
113 SCM glyph_sym
= me
->get_property ("style");
114 Real len
= ext
.length ();
116 || (robust_scm2double (me
->get_property ("collapse-height"), 0.0) >= ext
.length ()))
119 return SCM_UNSPECIFIED
;
123 if (glyph_sym
== ly_symbol2scm ("bracket"))
124 m
= staff_bracket (me
, len
);
125 else if (glyph_sym
== ly_symbol2scm ("brace"))
126 m
= staff_brace (me
, len
);
127 else if (glyph_sym
== ly_symbol2scm ("bar-line"))
128 m
= simple_bar (me
, len
);
129 else if (glyph_sym
== ly_symbol2scm ("line-bracket"))
130 m
= line_bracket (me
, len
);
132 m
.translate_axis (ext
.center (), Y_AXIS
);
133 return m
.smobbed_copy ();
137 System_start_delimiter::staff_brace (Grob
*me
, Real y
)
140 /* We go through the style sheet to lookup the font file
141 name. This is better than using find_font directly,
142 esp. because that triggers mktextfm for non-existent
144 SCM fam
= scm_cons (ly_symbol2scm ("font-encoding"),
145 ly_symbol2scm ("fetaBraces"));
147 SCM alist
= scm_list_n (fam
, SCM_UNDEFINED
);
148 fm
= select_font (me
->layout (), scm_list_n (alist
, SCM_UNDEFINED
));
152 int hi
= max ((int) fm
->count () - 1, 2);
154 /* do a binary search for each Y, not very efficient, but passable? */
158 int cmp
= (lo
+ hi
) / 2;
159 b
= fm
->get_indexed_char (cmp
);
160 if (b
[Y_AXIS
].is_empty () || b
[Y_AXIS
].length () > y
)
167 Stencil
stil (fm
->find_by_name ("brace" + to_string (lo
)));
168 stil
.translate_axis (-b
[X_AXIS
].length ()/2, X_AXIS
);
170 stil
.translate_axis (-0.2, X_AXIS
);
175 ADD_INTERFACE (System_start_delimiter
,
176 "The brace, bracket or bar in front of the system. The"
177 " following values for @code{style} are recognized:\n"
181 "A thick bracket, normally used to group similar"
182 " instruments in a score. Default for @code{StaffGroup}."
183 " @code{SystemStartBracket} uses this style.\n"
185 "A @q{piano style} brace normally used for an instrument"
186 " that uses two staves. The default style for"
187 " @code{GrandStaff}. @code{SystemStartBrace} uses this"
190 "A simple line between the staves in a score. Default"
191 " for staves enclosed in @code{<<} and @code{>>}."
192 " @code{SystemStartBar} uses this style.\n"
193 "@item line-bracket\n"
194 "A simple square, normally used for subgrouping"
195 " instruments in a score. @code{SystemStartSquare} uses"
199 "See also @file{input/regression/system-start-nesting.ly}.",