source file of the GNU LilyPond music typesetter
- (c) 1997--2001 Han-Wen Nienhuys <hanwen@cs.uu.nl>
+ (c) 1997--2002 Han-Wen Nienhuys <hanwen@cs.uu.nl>
*/
#include "span-bar.hh"
void
Span_bar::add_bar (Grob*me, Grob*b)
{
- Pointer_group_interface::add_element (me,"elements", b);
+ Pointer_group_interface::add_grob (me, ly_symbol2scm ("elements"), b);
me->add_dependency (b);
}
// compute common refpoint of elements
Grob *refp = me;
- for (SCM elts = first_elt; gh_pair_p (elts); elts = gh_cdr (elts))
+ for (SCM elts = first_elt; gh_pair_p (elts); elts = ly_cdr (elts))
{
- SCM smobbed_staff_bar = gh_car (elts);
+ SCM smobbed_staff_bar = ly_car (elts);
Grob *staff_bar = unsmob_grob (smobbed_staff_bar);
refp = staff_bar->common_refpoint (refp, Y_AXIS);
}
- // evaluate glyph
Span_bar::evaluate_glyph(me);
- SCM glyph = me->get_grob_property (ly_symbol2scm ("glyph"));
+ SCM glyph = me->get_grob_property ("glyph");
+
+ /*
+ glyph may not be a string, when ME is killed by Hara Kiri in
+ between.
+ */
+ if (!gh_string_p (glyph))
+ return SCM_EOL;
+
String glyph_str = ly_scm2string (glyph);
// compose span_bar_mol
Molecule span_bar_mol;
- Grob *prev_staff_bar = 0;
- for (SCM elts = first_elt; gh_pair_p (elts); elts = gh_cdr (elts))
+
+ Interval prev_extent;
+ for (SCM elts = first_elt; gh_pair_p (elts); elts = ly_cdr (elts))
{
- SCM smobbed_staff_bar = gh_car (elts);
+ SCM smobbed_staff_bar = ly_car (elts);
Grob *staff_bar = unsmob_grob (smobbed_staff_bar);
- if (prev_staff_bar)
+ Interval ext = staff_bar->extent (refp, Y_AXIS);
+ if (ext.empty_b ())
+ continue;
+
+ if (!prev_extent.empty_b ())
{
- Interval l(prev_staff_bar->extent (refp, Y_AXIS)[UP],
- staff_bar->extent (refp, Y_AXIS)[DOWN]);
+ Interval l(prev_extent [UP],
+ ext[DOWN]);
Molecule interbar
= Bar::compound_barline (staff_bar, glyph_str, l.length());
interbar.translate_axis (l.center (), Y_AXIS);
span_bar_mol.add_molecule (interbar);
}
- prev_staff_bar = staff_bar;
+ prev_extent = ext;
}
span_bar_mol.translate_axis (- me->relative_coordinate (refp, Y_AXIS), Y_AXIS);
Span_bar::evaluate_glyph (Grob*me)
{
SCM elts = me->get_grob_property ("elements");
- Grob * b = unsmob_grob (gh_car (elts));
- SCM glsym =ly_symbol2scm ("glyph");
- SCM gl =b ->get_grob_property (glsym);
+ SCM glyph_symbol = ly_symbol2scm ("glyph");
+ SCM gl = SCM_EOL;
+
+ while (gh_pair_p (elts))
+ {
+ gl = unsmob_grob (gh_car (elts))->internal_get_grob_property (glyph_symbol);
+ if (gh_string_p (gl))
+ break;
+ elts =gh_cdr (elts);
+ }
+
if (!gh_string_p (gl))
{
me->suicide ();
- return ;
+ return;
}
-
- String type = ly_scm2string (gl);
+ String type = ly_scm2string (gl);
if (type == "|:")
{
type = ".|";
}
gl = ly_str02scm (type.ch_C ());
- if (scm_equal_p (me->get_grob_property (glsym), gl) != SCM_BOOL_T)
- me->set_grob_property (glsym, gl);
+ if (scm_equal_p (me->internal_get_grob_property (glyph_symbol), gl) != SCM_BOOL_T)
+ me->internal_set_grob_property (glyph_symbol, gl);
}
Interval