X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fspan-bar.cc;h=a8b18623370fc475deacdc06677a28f6930c3167;hb=402045837e7134cdf90d1fcf31768c62227a4936;hp=c1d82c6df047d96cc1c8f79615112c29d1d3b8a2;hpb=3130370f1e21481c80abc3e67fb33b3b505cb241;p=lilypond.git diff --git a/lily/span-bar.cc b/lily/span-bar.cc index c1d82c6df0..a8b1862337 100644 --- a/lily/span-bar.cc +++ b/lily/span-bar.cc @@ -3,14 +3,14 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2002 Han-Wen Nienhuys + (c) 1997--2004 Han-Wen Nienhuys */ #include "span-bar.hh" #include "font-interface.hh" #include "dimensions.hh" #include "paper-def.hh" -#include "molecule.hh" +#include "stencil.hh" #include "warn.hh" #include "axis-group-interface.hh" #include "group-interface.hh" @@ -25,35 +25,33 @@ Span_bar::add_bar (Grob*me, Grob*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. - */ +MAKE_SCHEME_CALLBACK (Span_bar,print,1); -/* - This routine was originally by Juergen Reuter, but it was a on the - bulky side. Rewritten by Han-Wen. - */ +/* 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. */ + +/* 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) +Span_bar::print (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,20 +60,18 @@ 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 - Molecule span_bar_mol; + /* compose span_bar_mol */ + Stencil span_bar_mol; Interval prev_extent; for (SCM elts = first_elt; gh_pair_p (elts); elts = ly_cdr (elts)) @@ -83,31 +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]); - if (l.empty_b ()) + if (l.is_empty ()) { - /* there is overlap between the bar lines. We do nothign here. - */ + /* There is overlap between the bar lines. Do nothing. */ } else { - Molecule interbar - = Bar_line::compound_barline (staff_bar, glyph_str, l.length()); + Stencil interbar = Bar_line::compound_barline (staff_bar, + glyph_string, + l.length ()); interbar.translate_axis (l.center (), Y_AXIS); - span_bar_mol.add_molecule (interbar); + span_bar_mol.add_stencil (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 (); } @@ -124,7 +121,7 @@ Span_bar::width_callback (SCM element_smob, SCM scm_axis) /* urg. */ - Molecule m = Bar_line::compound_barline (se, gl, 40 PT); + Stencil m = Bar_line::compound_barline (se, gl, 40 PT); return ly_interval2scm (m.extent (X_AXIS)); } @@ -136,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_line::before_line_breaking (), because the info - in ELEMENTS already has been procced by Bar_line::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; } @@ -153,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_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.empty_b ()) + /* Bar_line::print 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); @@ -169,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 (); @@ -190,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); @@ -216,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))); } @@ -234,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_line::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.", + ""); + +