X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Ftuplet-bracket.cc;h=40e0c728c5ef2c353de391bd5da025386bce7007;hb=21c9f487462d40436299a4e3a1e3289a1bc4bf15;hp=627d6fcfb04a961e531e7ee9aabd6bc3ae2afc34;hpb=f875ef39c544bd3499dae5360e9e24f69933575f;p=lilypond.git diff --git a/lily/tuplet-bracket.cc b/lily/tuplet-bracket.cc index 627d6fcfb0..40e0c728c5 100644 --- a/lily/tuplet-bracket.cc +++ b/lily/tuplet-bracket.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2011 Jan Nieuwenhuizen + Copyright (C) 1997--2012 Jan Nieuwenhuizen Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify @@ -41,6 +41,7 @@ */ #include "tuplet-bracket.hh" +#include "axis-group-interface.hh" #include "line-interface.hh" #include "beam.hh" #include "warn.hh" @@ -51,6 +52,7 @@ #include "note-column.hh" #include "pointer-group-interface.hh" #include "directional-element-interface.hh" +#include "skyline.hh" #include "spanner.hh" #include "staff-symbol-referencer.hh" #include "lookup.hh" @@ -180,24 +182,13 @@ Tuplet_bracket::get_common_x (Spanner *me) return commonx; } -MAKE_SCHEME_CALLBACK (Tuplet_bracket, calc_control_points, 1) +MAKE_SCHEME_CALLBACK (Tuplet_bracket, calc_x_positions, 1) SCM -Tuplet_bracket::calc_control_points (SCM smob) +Tuplet_bracket::calc_x_positions (SCM smob) { Spanner *me = unsmob_spanner (smob); - extract_grob_set (me, "note-columns", columns); - SCM scm_positions = me->get_property ("positions"); - if (!me->is_live ()) - return SCM_EOL; - - if (!scm_is_pair (scm_positions)) - programming_error ("Positions should be number pair"); - - Drul_array positions - = robust_scm2drul (scm_positions, Drul_array (0, 0)); - Grob *commonx = get_common_x (me); Direction dir = get_grob_direction (me); @@ -213,8 +204,9 @@ Tuplet_bracket::calc_control_points (SCM smob) Direction d = LEFT; do { - x_span[d] = robust_relative_extent (bounds[d], commonx, X_AXIS)[d]; - + x_span[d] = bounds[d]->break_status_dir () + ? Axis_group_interface::generic_bound_extent (bounds[d], commonx, X_AXIS)[d] + : robust_relative_extent (bounds[d], commonx, X_AXIS)[d]; if (connect_to_other[d]) { Interval overshoot (robust_scm2drul (me->get_property ("break-overshoot"), @@ -223,8 +215,9 @@ Tuplet_bracket::calc_control_points (SCM smob) if (d == RIGHT) x_span[d] += d * overshoot[d]; else - x_span[d] = robust_relative_extent (bounds[d], - commonx, X_AXIS)[RIGHT] + x_span[d] = (bounds[d]->break_status_dir () + ? Axis_group_interface::generic_bound_extent (bounds[d], commonx, X_AXIS)[-d] + : robust_relative_extent (bounds[d], commonx, X_AXIS)[-d]) - overshoot[LEFT]; } @@ -254,9 +247,7 @@ Tuplet_bracket::calc_control_points (SCM smob) } while (flip (&d) != LEFT); - x_span -= me->get_bound (LEFT)->relative_coordinate (commonx, X_AXIS); - return scm_list_2 (ly_offset2scm (Offset (x_span[LEFT], positions[LEFT])), - ly_offset2scm (Offset (x_span[RIGHT], positions[RIGHT]))); + return ly_interval2scm (x_span - me->get_bound (LEFT)->relative_coordinate (commonx, X_AXIS)); } /* @@ -290,10 +281,11 @@ Tuplet_bracket::print (SCM smob) /* Don't print a tuplet bracket and number if - no control-points were calculated + no X or Y positions were calculated. */ - SCM cpoints = me->get_property ("control-points"); - if (scm_ilength (cpoints) < 2) + SCM scm_x_span = me->get_property ("X-positions"); + SCM scm_positions = me->get_property ("positions"); + if (!scm_is_pair (scm_x_span) || !scm_is_pair (scm_positions)) { me->suicide (); return SCM_EOL; @@ -307,12 +299,14 @@ Tuplet_bracket::print (SCM smob) == robust_scm2moment (me->get_bound (RIGHT)->get_column ()->get_property ("when"), Moment (0)))) bracket_visibility = false; - Drul_array points; - points[LEFT] = ly_scm2offset (scm_car (cpoints)); - points[RIGHT] = ly_scm2offset (scm_cadr (cpoints)); + Interval x_span = robust_scm2interval (scm_x_span, Interval (0.0, 0.0)); + Interval positions = robust_scm2interval (scm_positions, Interval (0.0, 0.0)); - Interval x_span (points[LEFT][X_AXIS], points[RIGHT][X_AXIS]); - Drul_array positions (points[LEFT][Y_AXIS], points[RIGHT][Y_AXIS]); + Drul_array points; + Direction d = LEFT; + do + points[d] = Offset (x_span[d], positions[d]); + while (flip (&d) != LEFT); Output_def *pap = me->layout (); @@ -657,6 +651,30 @@ Tuplet_bracket::calc_position_and_height (Grob *me_grob, Real *offset, Real *dy) points.push_back (Offset (tuplet_x[d] - x0, y)); } while (flip (&d) != LEFT); + // Check for number-on-bracket collisions + Grob *number = unsmob_grob (tuplets[i]->get_object ("tuplet-number")); + if (number) + points.push_back (Offset (number->extent (commonx, X_AXIS).center () - x0, + number->extent (commony, Y_AXIS)[dir])); + } + + if (to_boolean (me->get_property ("avoid-scripts")) + && !scm_is_number (me->get_property ("outside-staff-priority"))) + { + extract_grob_set (me, "scripts", scripts); + for (vsize i = 0; i < scripts.size (); i++) + { + if (!scripts[i]->is_live ()) + continue; + if (scm_is_number (scripts[i]->get_property ("outside-staff-priority"))) + continue; + + Interval script_x (scripts[i]->extent (commonx, X_AXIS)); + Interval script_y (scripts[i]->extent (commony, Y_AXIS)); + + points.push_back (Offset (script_x.center () - x0, + script_y[dir])); + } } *offset = -dir * infinity_f; @@ -771,6 +789,12 @@ Tuplet_bracket::add_column (Grob *me, Item *n) add_bound_item (dynamic_cast (me), n); } +void +Tuplet_bracket::add_script (Grob *me, Item *s) +{ + Pointer_group_interface::add_grob (me, ly_symbol2scm ("scripts"), s); +} + void Tuplet_bracket::add_tuplet_bracket (Grob *me, Grob *bracket) { @@ -816,11 +840,11 @@ ADD_INTERFACE (Tuplet_bracket, " @code{edge-text} are printed at the edges.", /* properties */ + "avoid-scripts " "bracket-flare " "bracket-visibility " "break-overshoot " "connect-to-neighbor " - "control-points " "direction " "edge-height " "edge-text " @@ -835,4 +859,5 @@ ADD_INTERFACE (Tuplet_bracket, "staff-padding " "thickness " "tuplets " + "X-positions " );