X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Ftuplet-bracket.cc;h=18e21a57df169a950532ec424632b43a1b5c2f94;hb=c4179cf1e0a382bac615e7c6e0c17b5ef62e0edd;hp=973ac4bc9355af70adc6b7e612d606df20f2a796;hpb=1d806d5a5a49dcf192259feac48510cf4e332291;p=lilypond.git diff --git a/lily/tuplet-bracket.cc b/lily/tuplet-bracket.cc index 973ac4bc93..18e21a57df 100644 --- a/lily/tuplet-bracket.cc +++ b/lily/tuplet-bracket.cc @@ -24,6 +24,7 @@ #include +#include "line-interface.hh" #include "beam.hh" #include "box.hh" #include "warn.hh" @@ -106,6 +107,19 @@ Tuplet_bracket::brew_molecule (SCM smob) if (!columns.size ()) return mol.smobbed_copy (); + + + { + SCM lp = me->get_grob_property ("left-position"); + SCM rp = me->get_grob_property ("right-position"); + + if (!gh_number_p (rp) || !gh_number_p (lp)) + after_line_breaking (smob); + } + + Real ly = robust_scm2double (me->get_grob_property ("left-position"), 0); + Real ry = robust_scm2double (me->get_grob_property ("right-position"), 0); + bool equally_long = false; Grob * par_beam = parallel_beam (me, columns, &equally_long); @@ -142,7 +156,7 @@ Tuplet_bracket::brew_molecule (SCM smob) commonx = commonx->common_refpoint (sp->get_bound(LEFT), X_AXIS); commonx = commonx->common_refpoint (sp->get_bound(RIGHT), X_AXIS); - Direction dir = Directional_element_interface::get (me); + Direction dir = get_grob_direction (me); Grob * lgr = get_x_bound_grob (columns[0], dir); Grob * rgr = get_x_bound_grob (columns.top(), dir); @@ -150,15 +164,14 @@ Tuplet_bracket::brew_molecule (SCM smob) Real x1 = rgr->extent (commonx,X_AXIS)[RIGHT]; Real w = x1 -x0; - - Real ly = gh_scm2double (me->get_grob_property ("left-position")); - Real ry = gh_scm2double (me->get_grob_property ("right-position")); - SCM number = me->get_grob_property ("text"); + SCM number = me->get_grob_property ("text"); + + Paper_def *pap = me->get_paper (); if (gh_string_p (number) && number_visibility) { SCM properties = Font_interface::font_alist_chain (me); - SCM snum = Text_item::interpret_markup (smob, properties, number); + SCM snum = Text_item::interpret_markup (pap->self_scm (), properties, number); Molecule num = *unsmob_molecule (snum); num.align_to (X_AXIS, CENTER); num.translate_axis (w/2, X_AXIS); @@ -168,16 +181,23 @@ Tuplet_bracket::brew_molecule (SCM smob) mol.add_molecule (num); } - - if (bracket_visibility) + + + /* + No bracket when it would be smaller than the number. + + TODO: should use GAP in calculation too. + */ + if (bracket_visibility && number_visibility + && mol.extent (X_AXIS).length () > w) { - Real lt = me->get_paper ()->get_realvar (ly_symbol2scm ("linethickness")); + bracket_visibility = false; + } - SCM thick = me->get_grob_property ("thickness"); - if (gh_number_p (thick)) - lt *= gh_scm2double (thick); - + if (bracket_visibility) + { SCM gap = me->get_grob_property ("gap"); + SCM fl = me->get_grob_property ("bracket-flare"); SCM eh = me->get_grob_property ("edge-height"); SCM sp = me->get_grob_property ("shorten-pair"); @@ -186,17 +206,17 @@ Tuplet_bracket::brew_molecule (SCM smob) Drul_array height, flare, shorten; do { flare[d] = height[d] = shorten[d] = 0.0; - if (ly_number_pair_p (fl)) + if (is_number_pair (fl)) flare[d] += gh_scm2double (index_get_cell (fl, d)); - if (ly_number_pair_p (eh)) + if (is_number_pair (eh)) height[d] += gh_scm2double (index_get_cell (eh, d)) * - dir; - if (ly_number_pair_p (sp)) + if (is_number_pair (sp)) shorten[d] += gh_scm2double (index_get_cell (sp, d)); } while (flip (&d) != LEFT); - Molecule brack = make_bracket (Y_AXIS, - w, ry - ly, lt, + Molecule brack = make_bracket (me, Y_AXIS, + Offset (w, ry - ly), height, gh_scm2double (gap), flare, @@ -216,13 +236,14 @@ Tuplet_bracket::brew_molecule (SCM smob) brackets. */ Molecule -Tuplet_bracket::make_bracket (Axis protusion_axis, - Real dx, Real dy, Real thick, Drul_array height, +Tuplet_bracket::make_bracket (Grob *me, // for line properties. + Axis protusion_axis, + Offset dz, + Drul_array height, Real gap, Drul_array flare, Drul_array shorten) { - Offset dz = Offset (dx,dy); Drul_array corners (Offset(0,0), dz); Real length = dz.length (); @@ -248,12 +269,11 @@ Tuplet_bracket::make_bracket (Axis protusion_axis, Molecule m; do { - - m.add_molecule (Lookup::line (thick, straight_corners[d], - gap_corners[d])); + m.add_molecule (Line_interface::line (me, straight_corners[d], + gap_corners[d])); - m.add_molecule (Lookup::line (thick, straight_corners[d], - flare_corners[d])); + m.add_molecule (Line_interface::line (me, straight_corners[d], + flare_corners[d])); } while (flip (&d) != LEFT); return m; @@ -273,8 +293,13 @@ Tuplet_bracket::calc_position_and_height (Grob*me,Real *offset, Real * dy) SCM cols = me->get_grob_property ("note-columns"); Grob * commony = common_refpoint_of_list (cols, me, Y_AXIS); Grob * commonx = common_refpoint_of_list (cols, me, X_AXIS); + + Interval staff; + + if (Grob * st = Staff_symbol_referencer::get_staff_symbol (me)) + staff = st->extent (commony, Y_AXIS); - Direction dir = Directional_element_interface::get (me); + Direction dir = get_grob_direction (me); /* Use outer non-rest columns to determine slope @@ -289,8 +314,24 @@ Tuplet_bracket::calc_position_and_height (Grob*me,Real *offset, Real * dy) if (l < r) { - *dy = columns[r]->extent (commony, Y_AXIS) [dir] - - columns[l]->extent (commony, Y_AXIS) [dir] ; + Interval rv =columns[r]->extent (commony, Y_AXIS); + Interval lv =columns[l]->extent (commony, Y_AXIS); + rv.unite (staff); + lv.unite (staff); + Real graphical_dy = rv[dir] - lv[dir]; + + Slice ls = Note_column::head_positions_interval (columns[l]); + Slice rs = Note_column::head_positions_interval (columns[r]); + + Interval musical_dy; + musical_dy[UP] = rs[UP] - ls[UP]; + musical_dy[DOWN] = rs[DOWN] - ls[DOWN]; + if (sign (musical_dy[UP]) != sign (musical_dy[DOWN])) + *dy = 0.0; + else if (sign (graphical_dy) != sign (musical_dy[DOWN])) + *dy = 0.0; + else + *dy = graphical_dy; } else * dy = 0; @@ -309,15 +350,16 @@ Tuplet_bracket::calc_position_and_height (Grob*me,Real *offset, Real * dy) Real x1 = rgr->extent (commonx,X_AXIS)[RIGHT]; - /* - Slope. - */ + /* + Slope. + */ Real factor = columns.size () > 1 ? 1/ (x1 - x0) : 1.0; for (int i = 0; i < columns.size (); i++) { - Real notey = columns[i]->extent (commony, Y_AXIS)[dir] - - me->relative_coordinate (commony, Y_AXIS); + Interval note_ext =columns[i]->extent (commony, Y_AXIS); + note_ext.unite (staff); + Real notey = note_ext[dir] - me->relative_coordinate (commony, Y_AXIS); Real x = columns[i]->relative_coordinate (commonx, X_AXIS) - x0; Real tuplety = *dy * x * factor; @@ -349,22 +391,6 @@ Tuplet_bracket::calc_position_and_height (Grob*me,Real *offset, Real * dy) } -/* - use first -> last note for slope, -*/ -void -Tuplet_bracket::calc_dy (Grob*me,Real * dy) -{ - Link_array columns= - Pointer_group_interface__extract_grobs (me, (Grob*)0, "note-columns"); - - /* - ugh. refps. - */ - Direction d = Directional_element_interface::get (me); - *dy = columns.top ()->extent (columns.top (), Y_AXIS) [d] - - columns[0]->extent (columns[0], Y_AXIS) [d]; -} /* @@ -405,16 +431,16 @@ Tuplet_bracket::after_line_breaking (SCM smob) } if (dynamic_cast (me)->broken_b ()) { - me->warning ("Tuplet_bracket was across linebreak. Farewell cruel world."); + me->warning (_("Killing tuplet bracket across linebreak.")); me->suicide(); return SCM_UNSPECIFIED; } - Direction dir = Directional_element_interface::get (me); + Direction dir = get_grob_direction (me); if (!dir) { dir = Tuplet_bracket::get_default_dir (me); - Directional_element_interface::set (me, dir); + set_grob_direction (me, dir); } bool equally_long = false; @@ -425,7 +451,7 @@ Tuplet_bracket::after_line_breaking (SCM smob) */ Real dy, offset; if (!par_beam - || Directional_element_interface::get (par_beam) != dir) + || get_grob_direction (par_beam) != dir) { calc_position_and_height (me,&offset,&dy); }