]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/tuplet-bracket.cc
* input/regression/tie-chord.ly (testLong): add a chord in 4ths
[lilypond.git] / lily / tuplet-bracket.cc
index d63ae09ecefe849dba095c3a09f1483fbacd77bb..3442e2d522ec91ed67ba18cf0220fb0b38afaab3 100644 (file)
 static Item *
 get_x_bound_item (Grob *me_grob, Direction hdir, Direction my_dir)
 {
-  Spanner *me = dynamic_cast<Spanner*> (me_grob);
+  Spanner *me = dynamic_cast<Spanner *> (me_grob);
   Item *g = me->get_bound (hdir);
   if (Note_column::has_interface (g)
       && Note_column::get_stem (g)
       && Note_column::dir (g) == my_dir)
-    {
-      g = Note_column::get_stem (g);
-    }
+    g = Note_column::get_stem (g);
 
   return g;
 }
@@ -73,14 +71,12 @@ Tuplet_bracket::parallel_beam (Grob *me_grob, Link_array<Grob> const &cols, bool
   Grob *s1 = Note_column::get_stem (cols[0]);
   Grob *s2 = Note_column::get_stem (cols.top ());
 
-
   if (s2 != me->get_bound (RIGHT))
     return 0;
 
   Grob *b1 = s1 ? Stem::get_beam (s1) : 0;
   Grob *b2 = s2 ? Stem::get_beam (s2) : 0;
 
-
   *equally_long = false;
   if (! (b1 && (b1 == b2) && !me->is_broken ()))
     return 0;
@@ -119,10 +115,10 @@ Tuplet_bracket::print (SCM smob)
       {
        /*
          UGH. dependency tracking!
-        */
+       */
        extract_grob_set (me, "tuplets", tuplets);
        for (int i = 0; i < tuplets.size (); i++)
-         Tuplet_bracket::print (tuplets[i]->self_scm());
+         Tuplet_bracket::print (tuplets[i]->self_scm ());
 
        after_line_breaking (smob);
       }
@@ -144,17 +140,13 @@ Tuplet_bracket::print (SCM smob)
   */
   SCM bracket = me->get_property ("bracket-visibility");
   if (scm_is_bool (bracket))
-    {
-      bracket_visibility = ly_scm2bool (bracket);
-    }
+    bracket_visibility = ly_scm2bool (bracket);
   else if (bracket == ly_symbol2scm ("if-no-beam"))
     bracket_visibility = !par_beam;
 
   SCM numb = me->get_property ("number-visibility");
   if (scm_is_bool (numb))
-    {
-      number_visibility = ly_scm2bool (numb);
-    }
+    number_visibility = ly_scm2bool (numb);
   else if (numb == ly_symbol2scm ("if-no-beam"))
     number_visibility = !par_beam;
 
@@ -175,10 +167,10 @@ Tuplet_bracket::print (SCM smob)
     {
       x_span[d] = robust_relative_extent (bounds[d], commonx, X_AXIS)[d];
       Direction break_dir = bounds[d]->break_status_dir ();
-      Spanner *orig_spanner = dynamic_cast<Spanner*> (me->original_);
+      Spanner *orig_spanner = dynamic_cast<Spanner *> (me->original_);
       connect_to_other[d]
        = (break_dir
-          && (me->get_break_index() - break_dir < orig_spanner->broken_intos_.size()));
+          && (me->get_break_index () - break_dir < orig_spanner->broken_intos_.size ()));
 
       if (connect_to_other[d])
        {
@@ -188,23 +180,23 @@ Tuplet_bracket::print (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] = robust_relative_extent (bounds[d], commonx, X_AXIS)[RIGHT]
              - overshoot[LEFT];
        }
       else if (d == RIGHT
               && (columns.is_empty ()
-               || (bounds[d]->get_column ()
-                   != dynamic_cast<Item*> (columns.top())->get_column ())))
+                  || (bounds[d]->get_column ()
+                      != dynamic_cast<Item *> (columns.top ())->get_column ())))
        {
          /*
            TODO: make padding tunable?
-          */
+         */
          x_span[d] = robust_relative_extent (bounds[d], commonx, X_AXIS) [LEFT] - 1.0;
        }
     }
   while (flip (&d) != LEFT);
 
-  Real w = x_span.length();
+  Real w = x_span.length ();
   SCM number = me->get_property ("text");
 
   Output_def *pap = me->get_layout ();
@@ -231,9 +223,7 @@ Tuplet_bracket::print (SCM smob)
   */
   if (bracket_visibility && number_visibility
       && mol.extent (X_AXIS).length () > w)
-    {
-      bracket_visibility = false;
-    }
+    bracket_visibility = false;
 
   if (bracket_visibility)
     {
@@ -282,7 +272,6 @@ Tuplet_bracket::print (SCM smob)
        }
       while (flip (&d) != LEFT);
 
-
       Stencil brack = make_bracket (me, Y_AXIS,
                                    Offset (w, ry - ly),
                                    height,
@@ -300,7 +289,6 @@ Tuplet_bracket::print (SCM smob)
        }
       while (flip (&d) != LEFT);
 
-
       mol.add_stencil (brack);
     }
 
@@ -336,18 +324,16 @@ Tuplet_bracket::make_bracket (Grob *me, // for line properties.
 
   Direction d = LEFT;
   do
-    {
-      straight_corners[d] += -d * shorten[d] / length * dz;
-    }
-  while (flip (&d) != LEFT);
+    straight_corners[d] += -d * shorten[d] / length * dz;
+  while (flip (&d) != LEFT)
+    ;
 
   if (gap.is_empty ())
     gap = Interval (0, 0);
   do
-    {
-      gap_corners[d] = (dz * 0.5) + gap[d] / length * dz;
-    }
-  while (flip (&d) != LEFT);
+    gap_corners[d] = (dz * 0.5) + gap[d] / length * dz;
+  while (flip (&d) != LEFT)
+    ;
 
   Drul_array<Offset> flare_corners = straight_corners;
   do
@@ -393,14 +379,13 @@ Tuplet_bracket::get_bounds (Grob *me, Grob **left, Grob **right)
     }
 }
 
-
 /*
   use first -> last note for slope, and then correct for disturbing
   notes in between.  */
 void
 Tuplet_bracket::calc_position_and_height (Grob *me_grob, Real *offset, Real *dy)
 {
-  Spanner *me = dynamic_cast<Spanner*> (me_grob);
+  Spanner *me = dynamic_cast<Spanner *> (me_grob);
 
   extract_grob_set (me, "note-columns", columns);
   extract_grob_set (me, "tuplets", tuplets);
@@ -408,9 +393,7 @@ Tuplet_bracket::calc_position_and_height (Grob *me_grob, Real *offset, Real *dy)
   Grob *commony = common_refpoint_of_array (columns, me, Y_AXIS);
   commony = common_refpoint_of_array (tuplets, commony, Y_AXIS);
   if (Grob *st = Staff_symbol_referencer::get_staff_symbol (me))
-    {
-      commony = st->common_refpoint (commony, Y_AXIS);
-    }
+    commony = st->common_refpoint (commony, Y_AXIS);
 
   Grob *commonx = common_refpoint_of_array (columns, me, X_AXIS);
   commonx = common_refpoint_of_array (tuplets, commonx, Y_AXIS);
@@ -419,8 +402,12 @@ Tuplet_bracket::calc_position_and_height (Grob *me_grob, Real *offset, Real *dy)
 
   Interval staff;
   if (Grob *st = Staff_symbol_referencer::get_staff_symbol (me))
-    staff = st->extent (commony, Y_AXIS);
-
+    {
+      staff = st->extent (commony, Y_AXIS);
+      Real pad = robust_scm2double (me->get_property ("staff-padding"), 0.5);
+      staff.widen (pad);
+    }
+  
   Direction dir = get_grob_direction (me);
 
   /*
@@ -460,14 +447,9 @@ Tuplet_bracket::calc_position_and_height (Grob *me_grob, Real *offset, Real *dy)
   Real x0 = robust_relative_extent (lgr, commonx, X_AXIS)[LEFT];
   Real x1 = robust_relative_extent (rgr, commonx, X_AXIS)[RIGHT];
 
-  /*
-    offset
-  */
-  Real factor = columns.size () > 1 ? 1 / (x1 - x0) : 1.0;
-
   Array<Offset> points;
-  points.push (Offset (x0, staff[dir]));
-  points.push (Offset (x1, staff[dir]));
+  points.push (Offset (x0 - x0, staff[dir]));
+  points.push (Offset (x1 - x0, staff[dir]));
 
   for (int i = 0; i < columns.size (); i++)
     {
@@ -505,15 +487,13 @@ Tuplet_bracket::calc_position_and_height (Grob *me_grob, Real *offset, Real *dy)
            Let's not take padding into account for nested tuplets.
            the edges can come very close to the stems, likewise for
            nested tuplets?
-          */
+         */
          Drul_array<Real> my_height
            = robust_scm2drul (me->get_property ("edge-height"),
                               Interval (0, 0));
-         if (dynamic_cast<Spanner*> (tuplets[i])->get_bound (d)
-             ==  me->get_bound (d))
-           {
-             y += dir * my_height[d];
-           }
+         if (dynamic_cast<Spanner *> (tuplets[i])->get_bound (d)
+             == me->get_bound (d))
+           y += dir * my_height[d];
 #endif
 
          points.push (Offset (tuplet_x[d] - x0, y));
@@ -521,13 +501,14 @@ Tuplet_bracket::calc_position_and_height (Grob *me_grob, Real *offset, Real *dy)
       while (flip (&d) != LEFT);
     }
 
+  Real factor = (columns.size () > 1) ? 1 / (x1 - x0) : 1.0;
   for (int i = 0; i < points.size (); i++)
     {
       Real x = points[i][X_AXIS];
-      Real tuplety = *dy * x * factor;
+      Real tuplety = (*dy) * x * factor;
 
       if (points[i][Y_AXIS] * dir > (*offset + tuplety) * dir)
-       *offset = points[i][Y_AXIS] - tuplety * sign (*dy) * dir;
+       *offset = points[i][Y_AXIS] - tuplety;
     }
 
   *offset += scm_to_double (me->get_property ("padding")) * dir;
@@ -598,9 +579,7 @@ Tuplet_bracket::after_line_breaking (SCM smob)
   Real offset = 0.0;
   if (!par_beam
       || get_grob_direction (par_beam) != dir)
-    {
-      calc_position_and_height (me, &offset, &dy);
-    }
+    calc_position_and_height (me, &offset, &dy);
   else
     {
       SCM ps = par_beam->get_property ("positions");
@@ -619,13 +598,9 @@ Tuplet_bracket::after_line_breaking (SCM smob)
   SCM rp = me->get_property ("right-position");
 
   if (scm_is_number (lp) && !scm_is_number (rp))
-    {
-      rp = scm_from_double (scm_to_double (lp) + dy);
-    }
+    rp = scm_from_double (scm_to_double (lp) + dy);
   else if (scm_is_number (rp) && !scm_is_number (lp))
-    {
-      lp = scm_from_double (scm_to_double (rp) - dy);
-    }
+    lp = scm_from_double (scm_to_double (rp) - dy);
   else if (!scm_is_number (rp) && !scm_is_number (lp))
     {
       lp = scm_from_double (offset);
@@ -646,7 +621,7 @@ Tuplet_bracket::get_default_dir (Grob *me)
 {
   Drul_array<int> dirs (0, 0);
   extract_grob_set (me, "note-columns", columns);
-  for (int i = 0 ; i < columns.size (); i++)
+  for (int i = 0; i < columns.size (); i++)
     {
       Grob *nc = columns[i];
       Direction d = Note_column::dir (nc);
@@ -673,8 +648,6 @@ Tuplet_bracket::add_tuplet_bracket (Grob *me, Grob *bracket)
   me->add_dependency (bracket);
 }
 
-
-
 ADD_INTERFACE (Tuplet_bracket,
               "tuplet-bracket-interface",
               "A bracket with a number in the middle, used for tuplets. "
@@ -684,8 +657,20 @@ ADD_INTERFACE (Tuplet_bracket,
               "At a line break, the markups in the @code{edge-text} are printed "
               "at the edges. ",
 
-              "note-columns bracket-flare edge-height shorten-pair "
-              "tuplets edge-text break-overshoot "
-              "padding left-position right-position bracket-visibility "
-              "number-visibility thickness direction");
+              
+              "bracket-flare "
+              "bracket-visibility "
+              "break-overshoot "
+              "direction "
+              "edge-height "
+              "edge-text "
+              "left-position "
+              "note-columns "
+              "number-visibility "
+              "padding "
+              "right-position "
+              "shorten-pair "
+              "staff-padding "
+              "thickness "
+              "tuplets ");