X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fbar.cc;h=80dad453c00c6fe8375e0a856f3f6754c1365690;hb=f988425624a6f6d1a48aea0ac0c1c84ff0857e56;hp=314f8e01a2d2227cf96fd52cad10f0c71c951b07;hpb=07d4d05df6479d58c3c5152c07d7c86b94ee98b4;p=lilypond.git diff --git a/lily/bar.cc b/lily/bar.cc index 314f8e01a2..80dad453c0 100644 --- a/lily/bar.cc +++ b/lily/bar.cc @@ -3,86 +3,183 @@ source file of the GNU LilyPond music typesetter - (c) 1997--1999 Han-Wen Nienhuys + (c) 1997--2000 Han-Wen Nienhuys */ +#include -#include "dimension-cache.hh" +#include "main.hh" +#include "dimensions.hh" +#include "score-element.hh" #include "bar.hh" #include "string.hh" #include "molecule.hh" #include "paper-def.hh" #include "lookup.hh" #include "debug.hh" +#include "all-font-metrics.hh" +#include "item.hh" +#include "staff-symbol-referencer.hh" +MAKE_SCHEME_CALLBACK(Bar,brew_molecule); -Bar::Bar () +SCM +Bar::brew_molecule (SCM smob) { - set_elt_property (breakable_scm_sym, SCM_BOOL_T); - type_str_ = "|"; -} + Score_element * me = unsmob_element (smob); -void -Bar::do_print () const -{ -#ifndef NPRINT - String s = type_str_; - DOUT << "type = " << s; -#endif + SCM s = me->get_elt_property ("glyph"); + SCM barsiz_proc = me->get_elt_property ("barsize-procedure"); + if (gh_string_p (s) && gh_procedure_p (barsiz_proc)) + { + String str =ly_scm2string (s); + SCM siz = gh_call1 (barsiz_proc, me->self_scm ()); + Real sz = gh_scm2double (siz); + if (sz < 0) + return SCM_EOL; + + return compound_barline (me, str, sz).create_scheme (); + } + return SCM_EOL; } -Real -Bar::get_bar_size () const + +Molecule +Bar::compound_barline (Score_element*me, String str, Real h) { - // Never called! - return 0; -} + Real kern = gh_scm2double (me->get_elt_property ("kern")); + Real thinkern = gh_scm2double (me->get_elt_property ("thin-kern")); + Real hair = gh_scm2double (me->get_elt_property ("hair-thickness")); + Real fatline = gh_scm2double (me->get_elt_property ("thick-thickness")); + Real staffline = me->paper_l ()->get_var ("stafflinethickness"); -Molecule* -Bar::do_brew_molecule_p () const -{ - Molecule *output = new Molecule (lookup_l ()->bar (type_str_, get_bar_size (), paper_l ())); + kern *= staffline; + thinkern *= staffline; + hair *= staffline; + fatline *= staffline; - return output; + Molecule thin = simple_barline (me, hair, h); + Molecule thick = simple_barline (me, fatline, h); + Molecule colon = me->lookup_l ()->afm_find ("dots-repeatcolon"); + + Molecule m; + + if (str == "") + { + return me->lookup_l ()->blank (Box (Interval(0, 0), Interval (-h/2, h/2))); + } + else if (str == "|") + { + return thin; + } + else if (str == "|.") + { + m.add_at_edge (X_AXIS, LEFT, thick, 0); + m.add_at_edge (X_AXIS, LEFT, thin, kern); + } + else if (str == ".|") + { + m.add_at_edge (X_AXIS, RIGHT, thick, 0); + m.add_at_edge (X_AXIS, RIGHT, thin, kern); + } + else if (str == ":|") + { + m.add_at_edge (X_AXIS, LEFT, thick, 0); + m.add_at_edge (X_AXIS, LEFT, thin, kern); + m.add_at_edge (X_AXIS, LEFT, colon, kern); + } + else if (str == "|:") + { + m.add_at_edge (X_AXIS, RIGHT, thick, 0); + m.add_at_edge (X_AXIS, RIGHT, thin, kern); + m.add_at_edge (X_AXIS, RIGHT, colon, kern); + } + else if (str == ":|:") + { + m.add_at_edge (X_AXIS, LEFT, thick, thinkern); + m.add_at_edge (X_AXIS, LEFT, colon, kern); + m.add_at_edge (X_AXIS, RIGHT, thick, kern); + m.add_at_edge (X_AXIS, RIGHT, colon, kern); + } + else if (str == ".|.") + { + m.add_at_edge (X_AXIS, LEFT, thick, thinkern); + m.add_at_edge (X_AXIS, RIGHT, thick, kern); + } + else if (str == "||") + { + m.add_at_edge (X_AXIS, RIGHT, thin, 0); + m.add_at_edge (X_AXIS, RIGHT, thin, thinkern); + } + + return m; } -/** - Prescriptions for splitting bars. - TODO: put this in SCM. - */ -static char const *bar_breaks[][3] ={ - {":|", ":|:", "|:"}, - {"|", "|", ""}, - {"", "|s", "|"}, - {"|", "|:", "|:"}, - {"|.", "|.", ""}, - {":|", ":|", ""}, - {"||", "||", ""}, - {".|.", ".|.", ""}, - {"", "scorebar", "scorepostbreak"}, - {"", "brace", "brace"}, - {"", "bracket", "bracket"}, - {0,0,0} -}; -void -Bar::do_pre_processing () +Molecule +Bar::simple_barline (Score_element*me,Real w, Real h) +{ + return me->lookup_l ()->filledbox (Box (Interval(0,w), Interval(-h/2, h/2))); +} + +MAKE_SCHEME_CALLBACK(Bar,before_line_breaking ); + +SCM +Bar::before_line_breaking (SCM smob) { - for (int i=0; bar_breaks[i][0]; i++) + Score_element*me=unsmob_element (smob); + Item * item = dynamic_cast (me); + + SCM g = me->get_elt_property ("glyph"); + SCM orig = g; + Direction bsd = item->break_status_dir (); + if (gh_string_p (g) && bsd) { - if (bar_breaks[i][1] == type_str_) - { - type_str_ = bar_breaks[i][break_status_dir ()+1]; - break; - } + SCM proc = me->get_elt_property ("break-glyph-function"); + g = gh_call2 (proc, g, gh_int2scm (bsd)); } - if (remove_elt_property (at_line_start_scm_sym)!= SCM_BOOL_F - && (break_status_dir () == RIGHT) && (type_str_ == "")) + + + if (!gh_string_p (g)) { - type_str_ = "|"; + me->set_elt_property ("molecule-callback", SCM_BOOL_T); + me->set_extent_callback (0, X_AXIS); + + // leave y_extent for spanbar? } - if (type_str_ =="") - set_empty (true, X_AXIS); + if (! gh_equal_p (g, orig)) + me->set_elt_property ("glyph", g); + + + return SCM_UNSPECIFIED; } +void +Bar::set_interface (Score_element*me) +{ + me->set_elt_property ("interfaces", + gh_cons (ly_symbol2scm ("bar-interface"), me->get_elt_property ("interfaces"))); +} + +bool +Bar::has_interface (Score_element*m) +{ + return m && m->has_interface (ly_symbol2scm ("bar-interface")); +} + + +MAKE_SCHEME_CALLBACK(Bar,get_staff_bar_size); +SCM +Bar::get_staff_bar_size (SCM smob) +{ + Score_element*me = unsmob_element (smob); + Real ss = Staff_symbol_referencer::staff_space (me); + SCM size = me->get_elt_property ("bar-size"); + if (gh_number_p (size)) + return gh_double2scm (gh_scm2double(size)*ss); + else + { + return gh_double2scm ((Staff_symbol_referencer::line_count (me) -1) * ss); + } +}