X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fmulti-measure-rest.cc;h=c6e143d3299e3ce666e8b48592761628810bd637;hb=c802622f935af83bb791ded58056428d6be31d0a;hp=81ba1f26da6becbda775143fd672ef0afe0d49b9;hpb=fa891b75e895f16fc3871531e244abe78f9d93ff;p=lilypond.git diff --git a/lily/multi-measure-rest.cc b/lily/multi-measure-rest.cc index 81ba1f26da..c6e143d329 100644 --- a/lily/multi-measure-rest.cc +++ b/lily/multi-measure-rest.cc @@ -11,39 +11,57 @@ #include "debug.hh" #include "paper-def.hh" #include "paper-column.hh" // urg -#include "bar.hh" -#include "lookup.hh" +#include "font-interface.hh" #include "rest.hh" #include "molecule.hh" #include "misc.hh" #include "group-interface.hh" -#include "stem.hh" +#include "spanner.hh" #include "staff-symbol-referencer.hh" +#include "text-item.hh" -Multi_measure_rest::Multi_measure_rest () +void +Multi_measure_rest::set_interface (Score_element*me) { - set_elt_property ("columns", SCM_EOL); + me->set_interface (ly_symbol2scm ("multi-measure-rest-interface")); } +bool +Multi_measure_rest::has_interface (Score_element*me) +{ + return me->has_interface (ly_symbol2scm ("multi-measure-rest-interface")); +} -/* + /* [TODO] 17 * variable-sized multi-measure rest symbol: |====| ?? */ -Molecule -Multi_measure_rest::do_brew_molecule () const +MAKE_SCHEME_CALLBACK(Multi_measure_rest,brew_molecule,1); +SCM +Multi_measure_rest::brew_molecule (SCM smob) { - Real staff_space - = staff_symbol_referencer (this).staff_space (); + Score_element *me = unsmob_element (smob); + Spanner * sp = dynamic_cast (me); + + SCM alist_chain = Font_interface::font_alist_chain (me); + + + SCM style_chain = + Font_interface::add_style (me, ly_symbol2scm ("mmrest-symbol"), + alist_chain); + + Font_metric *musfont + = Font_interface::get_font (me,style_chain); + + Real staff_space = Staff_symbol_referencer::staff_space (me); Interval sp_iv; Direction d = LEFT; do { - Item * col = get_bound (d)->column_l (); + Item * col = sp->get_bound (d)->column_l (); - Interval coldim = col->extent (X_AXIS) - + col->relative_coordinate (0, X_AXIS); + Interval coldim = col->extent (0, X_AXIS); sp_iv[d] = coldim[-d] ; } @@ -51,7 +69,7 @@ Multi_measure_rest::do_brew_molecule () const Molecule mol; Real x_off = 0.0; - Real rx = get_bound (LEFT)->relative_coordinate (0, X_AXIS); + Real rx = sp->get_bound (LEFT)->relative_coordinate (0, X_AXIS); /* we gotta stay clear of sp_iv, so move a bit to the right if needed. @@ -67,14 +85,15 @@ Multi_measure_rest::do_brew_molecule () const Molecule s; int measures = 1; - SCM m (get_elt_property ("measure-count")); + SCM m (me->get_elt_property ("measure-count")); if (gh_number_p (m)) { measures = gh_scm2int (m); } - if (measures <= paper_l() ->get_var ("multi_measure_rest_expand_limit")) + SCM limit = me->get_elt_property ("expand-limit"); + if (measures <= gh_scm2int (limit)) { /* Build a rest from smaller parts. Distances inbetween are @@ -101,9 +120,9 @@ Multi_measure_rest::do_brew_molecule () const } Real pad = s.empty_b () - ? 0.0 : paper_l ()->get_var ("multi_measure_rest_padding"); - - Molecule r (lookup_l ()->afm_find ("rests-" + to_str (k))); + ? 0.0 : gh_scm2double (me->get_elt_property ("padding")) * staff_space; + + Molecule r (musfont->find_by_name ("rests-" + to_str (k))); if (k == 0) r.translate_axis (staff_space, Y_AXIS); @@ -116,77 +135,57 @@ Multi_measure_rest::do_brew_molecule () const else { String idx = ("rests-") + to_str (-4); - s = lookup_l ()->afm_find (idx); + s = musfont->find_by_name (idx); } mol.add_molecule (s); if (measures > 1) { - Molecule s (lookup_l ()->text ("number", to_str (measures), paper_l ())); + Molecule s = Text_item::text2molecule (me, + ly_str02scm (to_str (measures).ch_C ()), + alist_chain); s.align_to (X_AXIS, CENTER); s.translate_axis (3.0 * staff_space, Y_AXIS); mol.add_molecule (s); } mol.translate_axis (x_off, X_AXIS); - return mol; + return mol.smobbed_copy(); } /* UGH. JUNKME elt prop "columns" isn't really needed. */ - void -Multi_measure_rest::do_add_processing () +Multi_measure_rest::add_column (Score_element*me,Item* c) { - if (gh_pair_p (get_elt_property ("columns"))) - { - Link_array column_arr (Group_interface__extract_elements (this, (Item*)0, "columns")); - - set_bound (LEFT, column_arr[0 >? column_arr.size () - 2]); - set_bound (RIGHT, column_arr.top ()); - } + Pointer_group_interface::add_element (me, "columns",c); - // set columns to SCM_EOL? -} - -void -Multi_measure_rest::do_post_processing () -{ - if (!gh_pair_p (get_elt_property ("columns"))) - set_elt_property ("transparent", SCM_BOOL_T); + add_bound_item (dynamic_cast (me),c); } - -void -Multi_measure_rest::add_column (Item* c) -{ - Group_interface gi (this, "columns"); - gi.add_element (c); - - - add_dependency (c); -} - +MAKE_SCHEME_CALLBACK (Multi_measure_rest, set_spacing_rods,1); -Array -Multi_measure_rest::get_rods () const +SCM +Multi_measure_rest::set_spacing_rods (SCM smob) { - Array a; + Score_element*me = unsmob_element (smob); - if (!(get_bound (LEFT) && get_bound (RIGHT))) + Spanner*sp = dynamic_cast (me); + if (!(sp->get_bound (LEFT) && sp->get_bound (RIGHT))) { programming_error ("Multi_measure_rest::get_rods (): I am not spanned!"); - return a; + return SCM_UNSPECIFIED; } - Item * l = get_bound (LEFT)->column_l (); - Item * r = get_bound (RIGHT)->column_l (); - Item * lb = l->find_broken_piece (RIGHT); - Item * rb = r->find_broken_piece (LEFT); + Item * l = sp->get_bound (LEFT)->column_l (); + Item * r = sp->get_bound (RIGHT)->column_l (); + Item * lb = l->find_prebroken_piece (RIGHT); + Item * rb = r->find_prebroken_piece (LEFT); Item* combinations[4][2]={{l,r}, {lb,r}, {l,rb},{lb,rb}}; + Real staff_space = Staff_symbol_referencer::staff_space (me); for (int i=0; i < 4; i++) { Item * l = combinations[i][0]; @@ -202,12 +201,11 @@ Multi_measure_rest::get_rods () const /* should do something more advanced. */ - rod.distance_f_ = l->extent (X_AXIS)[BIGGER] - r->extent (X_AXIS)[SMALLER] - + paper_l ()->get_var ("multi_measure_rest_x_minimum"); + rod.distance_f_ = l->extent (l, X_AXIS)[BIGGER] - r->extent (r, X_AXIS)[SMALLER] + + gh_scm2double (me->get_elt_property ("minimum-width")) * staff_space; - a.push (rod); + rod.add_to_cols (); } - - return a; + return SCM_UNSPECIFIED; }