]> git.donarmstrong.com Git - lilypond.git/commitdiff
A few fixes for cross-staff tuplet brackets.
authorJoe Neeman <joeneeman@gmail.com>
Mon, 25 Feb 2008 10:52:24 +0000 (12:52 +0200)
committerJoe Neeman <joeneeman@gmail.com>
Mon, 25 Feb 2008 10:52:24 +0000 (12:52 +0200)
lily/include/note-column.hh
lily/note-column.cc
lily/tuplet-bracket.cc

index 34a30ab5ddaff3b5df7ea79b8970d8d6c0c8471e..f29c50e66c2149d13c3059a545d3ab245d708bff 100644 (file)
@@ -33,6 +33,7 @@ public:
   static void add_head (Grob *me, Grob *);
   static bool has_rests (Grob *me);
   static Grob *dot_column (Grob *me);
+  static Interval cross_staff_extent (Grob *me, Grob *refp);
   DECLARE_GROB_INTERFACE();
 
   static Item *get_stem (Grob *);
index b1c6b9f272204417ddf050f2ebd1a2a036068bb4..68075fc25001306a2033b529d48fbc34c59053a8 100644 (file)
@@ -195,6 +195,20 @@ Note_column::arpeggio (Grob *me)
   return unsmob_grob (me->get_object ("arpeggio"));
 }
 
+/* If a note-column contains a cross-staff stem then
+   nc->extent (Y_AXIS, refp) will not consider the extent of the stem.
+   If you want the extent of the stem to be included (and you are safe
+   from any cross-staff issues) then call this function instead. */
+Interval
+Note_column::cross_staff_extent (Grob *me, Grob *refp)
+{
+  Interval iv = me->extent (refp, Y_AXIS);
+  if (Grob *s = get_stem (me))
+    iv.unite (s->extent (refp, Y_AXIS));
+
+  return iv;
+}
+
 ADD_INTERFACE (Note_column,
               "Stem and noteheads combined",
 
index 7caffc7cd1511c6ece579a7232e8b85aaa56b820..cfae0b98650d2317976c2ff9fae9338fe434a149 100644 (file)
@@ -496,7 +496,12 @@ Tuplet_bracket::calc_position_and_height (Grob *me_grob, Real *offset, Real *dy)
   commonx = common_refpoint_of_array (tuplets, commonx, Y_AXIS);
 
   Interval staff;
-  if (Grob *st = Staff_symbol_referencer::get_staff_symbol (me))
+  Grob *st = Staff_symbol_referencer::get_staff_symbol (me);
+
+  /* staff-padding doesn't work correctly on cross-staff tuplets
+     because it only considers one staff symbol. Until this works,
+     disable it. */
+  if (st && !to_boolean (me->get_property ("cross-staff")))
     {
       Real pad = robust_scm2double (me->get_property ("staff-padding"), -1.0);
       if  (pad >= 0.0)
@@ -535,9 +540,9 @@ Tuplet_bracket::calc_position_and_height (Grob *me_grob, Real *offset, Real *dy)
 
       Real ss = 0.5 * Staff_symbol_referencer::staff_space (me);
       Real lp = ss * robust_scm2double (stems[LEFT]->get_property ("stem-end-position"), 0.0)
-        + stems[LEFT]->get_parent (Y_AXIS)->relative_coordinate (commony, Y_AXIS) - my_offset;
+        + stems[LEFT]->get_parent (Y_AXIS)->relative_coordinate (commony, Y_AXIS);
       Real rp = ss * robust_scm2double (stems[RIGHT]->get_property ("stem-end-position"), 0.0)
-        + stems[RIGHT]->get_parent (Y_AXIS)->relative_coordinate (commony, Y_AXIS) - my_offset;
+        + stems[RIGHT]->get_parent (Y_AXIS)->relative_coordinate (commony, Y_AXIS);
 
       *dy = rp - lp;
       points.push_back (Offset (stems[LEFT]->relative_coordinate (commonx, X_AXIS) - x0, lp));
@@ -553,10 +558,11 @@ Tuplet_bracket::calc_position_and_height (Grob *me_grob, Real *offset, Real *dy)
       get_bounds (me, &left_col, &right_col);
       if (left_col && right_col)
        {
-         Interval rv = right_col->extent (commony, Y_AXIS);
-         Interval lv = left_col->extent (commony, Y_AXIS);
+         Interval rv = Note_column::cross_staff_extent (right_col, commony);
+         Interval lv = Note_column::cross_staff_extent (left_col, commony);
          rv.unite (staff);
          lv.unite (staff);
+
          Real graphical_dy = rv[dir] - lv[dir];
 
          Slice ls = Note_column::head_positions_interval (left_col);
@@ -577,11 +583,10 @@ Tuplet_bracket::calc_position_and_height (Grob *me_grob, Real *offset, Real *dy)
 
       for (vsize i = 0; i < columns.size (); i++)
        {
-         Interval note_ext = columns[i]->extent (commony, Y_AXIS);
-         Real notey = note_ext[dir] - my_offset;
-
+         Interval note_ext = Note_column::cross_staff_extent (columns[i], commony);
          Real x = columns[i]->relative_coordinate (commonx, X_AXIS) - x0;
-         points.push_back (Offset (x, notey));
+
+         points.push_back (Offset (x, note_ext[dir]));
        }
     }
 
@@ -634,7 +639,7 @@ Tuplet_bracket::calc_position_and_height (Grob *me_grob, Real *offset, Real *dy)
   for (vsize i = 0; i < points.size (); i++)
     {
       Real x = points[i][X_AXIS];
-      Real tuplety = (*dy) * x * factor;
+      Real tuplety = (*dy) * x * factor + my_offset;
 
       if (points[i][Y_AXIS] * dir > (*offset + tuplety) * dir)
        *offset = points[i][Y_AXIS] - tuplety;