X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fspan-bar.cc;h=fc2b4f0dc8e588f5038034b0a1a3252ae725618f;hb=366ac5a9c6dfb5a32111c8dd6ba40e49334402c3;hp=0e5d6e2f7ba27214964d63a19befb3a4cf022dfa;hpb=0817e0513d1016ff22a633b6fee20ddba2a062f2;p=lilypond.git diff --git a/lily/span-bar.cc b/lily/span-bar.cc index 0e5d6e2f7b..fc2b4f0dc8 100644 --- a/lily/span-bar.cc +++ b/lily/span-bar.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2001 Han-Wen Nienhuys + (c) 1997--2003 Han-Wen Nienhuys */ #include "span-bar.hh" @@ -15,45 +15,43 @@ #include "axis-group-interface.hh" #include "group-interface.hh" #include "grob.hh" -#include "bar.hh" +#include "bar-line.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); } MAKE_SCHEME_CALLBACK (Span_bar,brew_molecule,1); -/** - * Limitations/Bugs: - * - * (1) Elements from 'me->get_grob_property ("elements")' must be - * ordered according to their y coordinates relative to their common - * axis group parent. Otherwise, the computation goes mad. (TODO: - * apply a sort algorithm that ensures this precondition.) However, - * until now, I have seen no case where lily has not fulfilled this - * precondition. - * - * (2) This method depends on bar_engraver not being removed from - * staff context. If bar_engraver is removed, the size of the staff - * lines is evaluated as 0, which results in a solid span bar line - * with faulty y coordinate. - */ +/* Limitations/Bugs: -/* - This routine was originally by Juergen Reuter, but it was a on the - bulky side. Rewritten by Han-Wen. - */ + (1) Elements from 'me->get_grob_property ("elements")' must be + ordered according to their y coordinates relative to their common + axis group parent. Otherwise, the computation goes mad. + + (TODO: + apply a sort algorithm that ensures this precondition.) However, + until now, I have seen no case where lily has not fulfilled this + precondition. + + (2) This method depends on bar_engraver not being removed from + staff context. If bar_engraver is removed, the size of the staff + lines is evaluated as 0, which results in a solid span bar line + with faulty y coordinate. */ + +/* This routine was originally by Juergen Reuter, but it was a on the + bulky side. Rewritten by Han-Wen. */ SCM Span_bar::brew_molecule (SCM smobbed_me) { Grob *me = unsmob_grob (smobbed_me); SCM first_elt = me->get_grob_property ("elements"); - // compute common refpoint of elements + /* compute common refpoint of elements */ Grob *refp = me; for (SCM elts = first_elt; gh_pair_p (elts); elts = ly_cdr (elts)) { @@ -62,19 +60,17 @@ Span_bar::brew_molecule (SCM smobbed_me) refp = staff_bar->common_refpoint (refp, Y_AXIS); } - Span_bar::evaluate_glyph(me); + Span_bar::evaluate_glyph (me); SCM glyph = me->get_grob_property ("glyph"); - /* - glyph may not be a string, when ME is killed by Hara Kiri in - between. - */ + /* 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); + String glyph_string = ly_scm2string (glyph); - // compose span_bar_mol + /* compose span_bar_mol */ Molecule span_bar_mol; Interval prev_extent; @@ -83,23 +79,32 @@ Span_bar::brew_molecule (SCM smobbed_me) SCM smobbed_staff_bar = ly_car (elts); Grob *staff_bar = unsmob_grob (smobbed_staff_bar); Interval ext = staff_bar->extent (refp, Y_AXIS); - if (ext.empty_b ()) + if (ext.is_empty ()) continue; - if (!prev_extent.empty_b ()) + if (!prev_extent.is_empty ()) { - Interval l(prev_extent [UP], + 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); + if (l.is_empty ()) + { + /* There is overlap between the bar lines. Do nothing. */ + } + else + { + Molecule interbar = Bar_line::compound_barline (staff_bar, + glyph_string, + l.length ()); + interbar.translate_axis (l.center (), Y_AXIS); + span_bar_mol.add_molecule (interbar); + } } prev_extent = ext; } - span_bar_mol.translate_axis (- me->relative_coordinate (refp, Y_AXIS), Y_AXIS); + span_bar_mol.translate_axis (- me->relative_coordinate (refp, Y_AXIS), + Y_AXIS); return span_bar_mol.smobbed_copy (); } @@ -116,7 +121,7 @@ Span_bar::width_callback (SCM element_smob, SCM scm_axis) /* urg. */ - Molecule m = Bar::compound_barline (se, gl, 40 PT); + Molecule m = Bar_line::compound_barline (se, gl, 40 PT); return ly_interval2scm (m.extent (X_AXIS)); } @@ -128,10 +133,9 @@ Span_bar::before_line_breaking (SCM smob) evaluate_empty (unsmob_grob (smob)); evaluate_glyph (unsmob_grob (smob)); - /* - no need to call Bar::before_line_breaking (), because the info - in ELEMENTS already has been procced by Bar::before_line_breaking (). - */ + /* No need to call Bar_line::before_line_breaking (), because the info + in ELEMENTS already has been procced by + Bar_line::before_line_breaking (). */ return SCM_UNSPECIFIED; } @@ -145,11 +149,10 @@ Span_bar::center_on_spanned_callback (SCM element_smob, SCM axis) assert (a == Y_AXIS); Interval i (get_spanned_interval (me)); - /* - Bar::brew_molecule delivers a barline of y-extent (-h/2,h/2), so - we have to translate ourselves to be in the center of the - interval that we span. */ - if (i.empty_b ()) + /* Bar_line::brew_molecule delivers a barline of y-extent (-h/2,h/2), so + we have to translate ourselves to be in the center of the + interval that we span. */ + if (i.is_empty ()) { me->suicide (); return gh_double2scm (0.0); @@ -161,12 +164,9 @@ Span_bar::center_on_spanned_callback (SCM element_smob, SCM axis) void Span_bar::evaluate_empty (Grob*me) { - /* - TODO: filter all hara-kiried out of ELEMENS list, and then - optionally do suicide. Call this cleanage function from - center_on_spanned_callback () as well. - - */ + /* TODO: filter all hara-kiried out of ELEMENS list, and then + optionally do suicide. Call this cleanage function from + center_on_spanned_callback () as well. */ if (!gh_pair_p (me->get_grob_property ("elements"))) { me->suicide (); @@ -182,7 +182,8 @@ Span_bar::evaluate_glyph (Grob*me) while (gh_pair_p (elts)) { - gl = unsmob_grob (gh_car (elts))->internal_get_grob_property (glyph_symbol); + gl = unsmob_grob (gh_car (elts)) + ->internal_get_grob_property (glyph_symbol); if (gh_string_p (gl)) break; elts =gh_cdr (elts); @@ -208,15 +209,17 @@ Span_bar::evaluate_glyph (Grob*me) type = ".|."; } - gl = ly_str02scm (type.ch_C ()); - if (scm_equal_p (me->internal_get_grob_property (glyph_symbol), gl) != SCM_BOOL_T) + gl = scm_makfrom0str (type.to_str0 ()); + if (scm_equal_p (me->internal_get_grob_property (glyph_symbol), gl) + != SCM_BOOL_T) me->internal_set_grob_property (glyph_symbol, gl); } Interval Span_bar::get_spanned_interval (Grob*me) { - return ly_scm2interval (Axis_group_interface::group_extent_callback (me->self_scm (), gh_int2scm (Y_AXIS))); + return ly_scm2interval (Axis_group_interface::group_extent_callback + (me->self_scm (), gh_int2scm (Y_AXIS))); } @@ -226,28 +229,19 @@ Span_bar::get_bar_size (SCM smob) { Grob* me = unsmob_grob (smob); Interval iv (get_spanned_interval (me)); - if (iv.empty_b ()) + if (iv.is_empty ()) { - /* - This happens if the bars are hara-kiried from under us. - */ + /* This happens if the bars are hara-kiried from under us. */ me->suicide (); return gh_double2scm (-1); } return gh_double2scm (iv.length ()); } -void -Span_bar::set_interface (Grob *me) -{ - Bar::set_interface (me); - - me->set_interface (ly_symbol2scm ("span-bar-interface")); - me->set_extent_callback (SCM_EOL, Y_AXIS); -} -bool -Span_bar::has_interface (Grob*m) -{ - return m && m->has_interface (ly_symbol2scm ("span-bar-interface")); -} + +ADD_INTERFACE (Span_bar,"span-bar-interface", + "A bar line that spans other barlines (typically used to get cross-staff barlines.", + ""); + +