X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fmulti-measure-rest.cc;h=1549cf727c2e0c505be70cb7b79722c439dfbf47;hb=f05cfd7757b31723fe6af2f5c0e2fdbaebea3b85;hp=8353e19812d10d45215075ca2bb6f2b3bb65407d;hpb=f7f4d9dcd37086b5c8b417719a0fcc924aceef92;p=lilypond.git diff --git a/lily/multi-measure-rest.cc b/lily/multi-measure-rest.cc index 8353e19812..1549cf727c 100644 --- a/lily/multi-measure-rest.cc +++ b/lily/multi-measure-rest.cc @@ -85,31 +85,30 @@ Multi_measure_rest::brew_molecule (SCM smob) Interval sp_iv; Direction d = LEFT; + + Grob *common = sp->get_bound (LEFT)->common_refpoint (sp->get_bound (RIGHT), X_AXIS); do { Item * col = sp->get_bound (d)->column_l (); - Interval coldim = col->extent (0, X_AXIS); + Interval coldim = col->extent (common, X_AXIS); sp_iv[d] = coldim[-d] ; } while ((flip (&d)) != LEFT); - Molecule mol; - Real x_off = 0.0; + + Real space = sp_iv.length(); 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. */ - x_off += (sp_iv[LEFT] - rx) >? 0; + Real x_off = (sp_iv[LEFT] - rx) >? 0; - /* - center between stuff. - */ - x_off += sp_iv.length ()/ 2; - mol.add_molecule (symbol_molecule (me)); + Molecule mol; + mol.add_molecule (symbol_molecule (me, space)); int measures = 0; SCM m (me->get_grob_property ("measure-count")); @@ -123,8 +122,12 @@ Multi_measure_rest::brew_molecule (SCM smob) 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, Y_AXIS); + + s.translate_axis (mol.extent (X_AXIS).center (), X_AXIS); mol.add_molecule (s); } mol.translate_axis (x_off, X_AXIS); @@ -133,19 +136,8 @@ Multi_measure_rest::brew_molecule (SCM smob) Molecule -Multi_measure_rest::symbol_molecule (Grob *me) +Multi_measure_rest::symbol_molecule (Grob *me, Real space) { - SCM alist_chain = Font_interface::font_alist_chain (me); - - SCM style_chain = - Font_interface::add_style (me, ly_symbol2scm ("mmrest-symbol"), - alist_chain); - - Real staff_space = Staff_symbol_referencer::staff_space (me); - Font_metric *musfont - = Font_interface::get_font (me,style_chain); - Molecule s; - int measures = 0; SCM m (me->get_grob_property ("measure-count")); if (gh_number_p (m)) @@ -156,30 +148,48 @@ Multi_measure_rest::symbol_molecule (Grob *me) SCM limit = me->get_grob_property ("expand-limit"); if (measures <= 0) - return s; + return Molecule(); + + if (measures > gh_scm2int (limit)) + { + Real padding = 0.15; + Molecule s = big_rest (me, (1.0 - 2*padding) * space); + s.translate_axis (padding * space, X_AXIS); + return s; + } + + SCM alist_chain = Font_interface::font_alist_chain (me); + + SCM style_chain = + Font_interface::add_style (me, ly_symbol2scm ("mmrest-symbol"), + alist_chain); + + Real staff_space = Staff_symbol_referencer::staff_space (me); + Font_metric *musfont + = Font_interface::get_font (me,style_chain); + if (measures == 1) { - s = musfont->find_by_name (Rest::glyph_name (me, 0, "")); + Molecule s = musfont->find_by_name (Rest::glyph_name (me, 0, "")); /* ugh. */ if (Staff_symbol_referencer::position_f (me) == 0.0) s.translate_axis (staff_space, Y_AXIS); + + s.translate_axis ((space - s.extent (X_AXIS).length ())/2, X_AXIS); + + return s ; } - else if (measures <= gh_scm2int (limit)) - { - Real pad = gh_scm2double (me->get_grob_property ("padding")) * staff_space; - s = church_rest (musfont, measures, staff_space, pad); - } - else + else { - Real w = gh_scm2double (me->get_grob_property ("width")); - s = big_rest (me, w); + return church_rest (me, musfont, measures, space); } - return s; } + + Molecule Multi_measure_rest::big_rest (Grob *me, Real width) { @@ -197,25 +207,26 @@ Multi_measure_rest::big_rest (Grob *me, Real width) m.add_at_edge (X_AXIS, RIGHT, yb, -ythick); m.add_at_edge (X_AXIS, LEFT, yb, -ythick); - m.align_to (X_AXIS, CENTER); + m.align_to (X_AXIS, LEFT); return m; } /* Kirchenpause (?) - */ Molecule -Multi_measure_rest::church_rest (Font_metric *musfont, int measures, - Real staff_space, Real padding) +Multi_measure_rest::church_rest (Grob*me, Font_metric *musfont, int measures, + Real space) { - Molecule s; - /* - Build a rest from smaller parts. Distances inbetween are - really variable, see Wanske pp. 125 */ - + SCM mols = SCM_EOL; + + /* + see Wanske pp. 125 + */ int l = measures; + int count = 0; + Real symbols_width = 0.0; while (l) { int k; @@ -235,22 +246,32 @@ Multi_measure_rest::church_rest (Font_metric *musfont, int measures, l --; } - Real pad = s.empty_b () ? 0.0 : padding; - Molecule r (musfont->find_by_name ("rests-" + to_str (k))); if (k == 0) - r.translate_axis (staff_space, Y_AXIS); - - s.add_at_edge (X_AXIS, RIGHT, r, pad); + { + Real staff_space = Staff_symbol_referencer::staff_space (me); + r.translate_axis (staff_space, Y_AXIS); + } + symbols_width += r.extent (X_AXIS).length (); + mols = gh_cons (r.smobbed_copy (), mols); + count ++; + } + + + Real outer_padding_factor = 1.5; // make outer padding this much bigger. + Real inner_padding = (space - symbols_width) / (2 * outer_padding_factor + (count-1)); + + Molecule mol; + for (SCM s = mols; gh_pair_p (s); s = gh_cdr(s)) + { + mol.add_at_edge (X_AXIS, LEFT, *unsmob_molecule (gh_car (s)), inner_padding); } + mol.align_to (X_AXIS, LEFT); + mol.translate_axis (outer_padding_factor * inner_padding, X_AXIS); - s.align_to (X_AXIS, CENTER); - return s; + return mol; } -/* - UGH. JUNKME elt prop "columns" isn't really needed. - */ void Multi_measure_rest::add_column (Grob*me,Item* c) { @@ -263,6 +284,8 @@ MAKE_SCHEME_CALLBACK (Multi_measure_rest, set_spacing_rods,1); SCM Multi_measure_rest::set_spacing_rods (SCM smob) { + return SCM_UNSPECIFIED; + Grob*me = unsmob_grob (smob); Spanner*sp = dynamic_cast (me); @@ -290,14 +313,8 @@ Multi_measure_rest::set_spacing_rods (SCM smob) Rod rod; rod.item_l_drul_[LEFT] = l; rod.item_l_drul_[RIGHT] = r; - - /* - should do something more advanced. - */ - Molecule m = symbol_molecule(me); - rod.distance_f_ = l->extent (l, X_AXIS)[BIGGER] - r->extent (r, X_AXIS)[SMALLER] - + m.extent (X_AXIS).length () + 2.5*staff_space; + + 4.0; // magic! rod.add_to_cols (); } @@ -310,7 +327,6 @@ ADD_INTERFACE (Multi_measure_rest,"multi-measure-rest-interface", "A rest that spans a whole number of measures. For typesetting the numbers, fields from font-interface may be used. -padding is the space between number and rest. Measured in staffspace. ", - "thickness measure-count expand-limit padding"); + "thickness measure-count expand-limit");