]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/note-collision.cc
Grand fixcc.py run on all .hh .cc files.
[lilypond.git] / lily / note-collision.cc
index b0049c69ea40300d73427d1808324c94b8addb08..ef591c2b6dc17ed910d6359ab89ae30ee006b505 100644 (file)
 #include "stem.hh"
 #include "warn.hh"
 
-
 void
 check_meshing_chords (Grob *me,
-                     Drul_array<vector<Real> > *offsets,
-                     Drul_array<vector<Slice> > const &extents,
-                     Drul_array<vector<Grob*> > const &clash_groups)
+                      Drul_array<vector<Real> > *offsets,
+                      Drul_array<vector<Slice> > const &extents,
+                      Drul_array<vector<Grob *> > const &clash_groups)
 
 {
   if (!extents[UP].size () || !extents[DOWN].size ())
@@ -51,8 +50,8 @@ check_meshing_chords (Grob *me,
   if (!Note_column::get_stem (clash_up) || !Note_column::get_stem (clash_down))
     return;
 
-  Drul_array<Grob*> stems (Note_column::get_stem (clash_down),
-                          Note_column::get_stem (clash_up));
+  Drul_array<Grob *> stems (Note_column::get_stem (clash_down),
+                            Note_column::get_stem (clash_up));
 
   Grob *head_up = Note_column::first_head (clash_up);
   Grob *head_down = Note_column::first_head (clash_down);
@@ -70,7 +69,7 @@ check_meshing_chords (Grob *me,
 
   /* Do not merge notes typeset in different style. */
   if (!ly_is_equal (head_up->get_property ("style"),
-                   head_down->get_property ("style")))
+                    head_down->get_property ("style")))
     merge_possible = false;
 
   int up_ball_type = Rhythmic_head::duration_log (head_up);
@@ -95,9 +94,9 @@ check_meshing_chords (Grob *me,
      them indistinguishable.  */
   if (merge_possible
       && ((Stem::duration_log (stems[UP]) == 1
-          && Stem::duration_log (stems[DOWN]) == 2)
-         || (Stem::duration_log (stems[UP]) == 2
-             && Stem::duration_log (stems[DOWN]) == 1)))
+           && Stem::duration_log (stems[DOWN]) == 2)
+          || (Stem::duration_log (stems[UP]) == 2
+              && Stem::duration_log (stems[DOWN]) == 1)))
     merge_possible = false;
 
   /*
@@ -133,36 +132,36 @@ check_meshing_chords (Grob *me,
   bool distant_half_collide = false;
   bool full_collide = false;
 
-  for (vsize i = 0, j = 0; i < ups.size () && j < dps.size (); )
+  for (vsize i = 0, j = 0; i < ups.size () && j < dps.size ();)
     {
       if (abs (ups[i] - dps[j]) == 1)
-       {
-         merge_possible = false;
-         if (ups[i] > dps[j])
-           close_half_collide = true;
-         else
-           distant_half_collide = true;
-       }
+        {
+          merge_possible = false;
+          if (ups[i] > dps[j])
+            close_half_collide = true;
+          else
+            distant_half_collide = true;
+        }
       else if (ups[i] == dps[j])
-       full_collide = true;
+        full_collide = true;
       else if (ups[i] > dps[0] && ups[i] < dps.back ())
-       merge_possible = false;
+        merge_possible = false;
       else if (dps[j] > ups[0] && dps[j] < ups.back ())
-       merge_possible = false;
+        merge_possible = false;
 
       if (ups[i] < dps[j])
-       i++;
+        i++;
       else if (ups[i] > dps[j])
-       j++;
+        j++;
       else
-       {
-         i++;
-         j++;
-       }
+        {
+          i++;
+          j++;
+        }
     }
 
   full_collide = full_collide || (close_half_collide
-                                 && distant_half_collide);
+                                  && distant_half_collide);
 
   Real shift_amount = 1;
 
@@ -171,7 +170,7 @@ check_meshing_chords (Grob *me,
      the top note of which is the same pitch as the lowest upstem note, they
      shouldn't count as touching.
   */
-  if (dps.back () == ups[0] && dps.size () > 1 && dps[dps.size() - 2] == ups[0] - 1)
+  if (dps.back () == ups[0] && dps.size () > 1 && dps[dps.size () - 2] == ups[0] - 1)
     touch = false;
 
   if (touch)
@@ -183,9 +182,9 @@ check_meshing_chords (Grob *me,
   if (full_collide)
     {
       if (Rhythmic_head::dot_count (head_up) > Rhythmic_head::dot_count (head_down))
-       shift_amount = 1;
+        shift_amount = 1;
       else if (Rhythmic_head::dot_count (head_up) < Rhythmic_head::dot_count (head_down))
-       stem_to_stem = true;
+        stem_to_stem = true;
     }
 
   /* The solfa is a triangle, which is inverted depending on stem
@@ -209,54 +208,54 @@ check_meshing_chords (Grob *me,
       shift_amount = 0;
 
       /* If possible, don't wipe any heads.  Else, wipe shortest head,
-        or head with smallest amount of dots.  Note: when merging
-        different heads, dots on the smaller one disappear. */
+         or head with smallest amount of dots.  Note: when merging
+         different heads, dots on the smaller one disappear. */
       Grob *wipe_ball = 0;
       Grob *dot_wipe_head = head_up;
 
       if (up_ball_type == down_ball_type)
-       {
-         if (Rhythmic_head::dot_count (head_down) < Rhythmic_head::dot_count (head_up))
-           {
-             wipe_ball = head_down;
-             dot_wipe_head = head_down;
-           }
-         else if (Rhythmic_head::dot_count (head_down) > Rhythmic_head::dot_count (head_up))
-           {
-             dot_wipe_head = head_up;
-             wipe_ball = head_up;
-           }
-         else
-           dot_wipe_head = head_up;
-       }
+        {
+          if (Rhythmic_head::dot_count (head_down) < Rhythmic_head::dot_count (head_up))
+            {
+              wipe_ball = head_down;
+              dot_wipe_head = head_down;
+            }
+          else if (Rhythmic_head::dot_count (head_down) > Rhythmic_head::dot_count (head_up))
+            {
+              dot_wipe_head = head_up;
+              wipe_ball = head_up;
+            }
+          else
+            dot_wipe_head = head_up;
+        }
       else if (down_ball_type > up_ball_type)
-       {
-         wipe_ball = head_down;
-         dot_wipe_head = head_down;
-       }
+        {
+          wipe_ball = head_down;
+          dot_wipe_head = head_down;
+        }
       else if (down_ball_type < up_ball_type)
-       {
-         wipe_ball = head_up;
-         dot_wipe_head = head_up;
-         /*
-           If upper head is eighth note or shorter, and lower head is half note,
-           shift by the difference between the open and filled note head widths,
-           otherwise upper stem will be misaligned slightly.
-         */
-         if (Stem::duration_log (stems[DOWN]) == 1
-             && Stem::duration_log (stems[UP]) >= 3)
-           shift_amount = (1 - head_up->extent (head_up, X_AXIS).length () /
-                           head_down->extent (head_down, X_AXIS).length ()) * 0.5;
-       }
+        {
+          wipe_ball = head_up;
+          dot_wipe_head = head_up;
+          /*
+            If upper head is eighth note or shorter, and lower head is half note,
+            shift by the difference between the open and filled note head widths,
+            otherwise upper stem will be misaligned slightly.
+          */
+          if (Stem::duration_log (stems[DOWN]) == 1
+              && Stem::duration_log (stems[UP]) >= 3)
+            shift_amount = (1 - head_up->extent (head_up, X_AXIS).length ()
+                            / head_down->extent (head_down, X_AXIS).length ()) * 0.5;
+        }
 
       if (dot_wipe_head)
-       {
-         if (Grob *d = unsmob_grob (dot_wipe_head->get_object ("dot")))
-           d->suicide ();
-       }
+        {
+          if (Grob *d = unsmob_grob (dot_wipe_head->get_object ("dot")))
+            d->suicide ();
+        }
 
       if (wipe_ball && wipe_ball->is_live ())
-       wipe_ball->set_property ("transparent", SCM_BOOL_T);
+        wipe_ball->set_property ("transparent", SCM_BOOL_T);
     }
   /* TODO: these numbers are magic; should devise a set of grob props
      to tune this behavior. */
@@ -276,19 +275,18 @@ check_meshing_chords (Grob *me,
     shift_amount *= 0.17;
 
   /*
-
   */
   if (full_collide
-      && down_ball_type * up_ball_type == 0)
+      && down_ball_type *up_ball_type == 0)
     {
       if (up_ball_type == 0 && down_ball_type == 1)
-       shift_amount *= 1.25;
+        shift_amount *= 1.25;
       else if (up_ball_type == 0 && down_ball_type == 2)
-       shift_amount *= 1.35;
+        shift_amount *= 1.35;
       else if (down_ball_type == 0 && up_ball_type == 1)
-       shift_amount *= 0.7;
+        shift_amount *= 0.7;
       else if (down_ball_type == 0 && up_ball_type == 2)
-       shift_amount *= 0.75;
+        shift_amount *= 0.75;
     }
 
   /*
@@ -305,20 +303,20 @@ check_meshing_chords (Grob *me,
     {
       Grob *staff = Staff_symbol_referencer::get_staff_symbol (me);
       if (!Staff_symbol_referencer::on_line (staff, ups[0]))
-       {
-         /*
-           TODO: consider junking the else body.
-         */
-         if (to_boolean (me->get_property ("prefer-dotted-right")))
-           shift_amount = 0.5;
-         else
-           {
-             Grob *d = unsmob_grob (head_up->get_object ("dot"));
-             Grob *parent = d->get_parent (X_AXIS);
-             if (Dot_column::has_interface (parent))
-               Side_position_interface::add_support (parent, head_down);
-           }
-       }
+        {
+          /*
+            TODO: consider junking the else body.
+          */
+          if (to_boolean (me->get_property ("prefer-dotted-right")))
+            shift_amount = 0.5;
+          else
+            {
+              Grob *d = unsmob_grob (head_up->get_object ("dot"));
+              Grob *parent = d->get_parent (X_AXIS);
+              if (Dot_column::has_interface (parent))
+                Side_position_interface::add_support (parent, head_down);
+            }
+        }
     }
 
   /* For full or close half collisions, the right hand head may
@@ -331,35 +329,34 @@ check_meshing_chords (Grob *me,
       Grob *parent = d->get_parent (X_AXIS);
 
       /*
-       FIXME:
+        FIXME:
 
-       |
-       x . o
-       |
+        |
+        x . o
+        |
 
 
-       the . is put right of o which is erroneous o force-shifted
-       far to the right.
+        the . is put right of o which is erroneous o force-shifted
+        far to the right.
       */
       if (Dot_column::has_interface (parent))
-       {
-         Grob *stem = unsmob_grob (head_up->get_object ("stem"));
-         extract_grob_set (stem, "note-heads", heads);
-         for (vsize i = 0; i < heads.size (); i++)
-           Side_position_interface::add_support (parent, heads[i]);
-       }
+        {
+          Grob *stem = unsmob_grob (head_up->get_object ("stem"));
+          extract_grob_set (stem, "note-heads", heads);
+          for (vsize i = 0; i < heads.size (); i++)
+            Side_position_interface::add_support (parent, heads[i]);
+        }
     }
 
   Direction d = UP;
   do
     {
       for (vsize i = 0; i < clash_groups[d].size (); i++)
-       (*offsets)[d][i] += d * shift_amount;
+        (*offsets)[d][i] += d * shift_amount;
     }
   while ((flip (&d)) != UP);
 }
 
-
 MAKE_SCHEME_CALLBACK (Note_collision_interface, calc_positioning_done, 1)
 SCM
 Note_collision_interface::calc_positioning_done (SCM smob)
@@ -367,18 +364,18 @@ Note_collision_interface::calc_positioning_done (SCM smob)
   Grob *me = unsmob_grob (smob);
   me->set_property ("positioning-done", SCM_BOOL_T);
 
-  Drul_array<vector<Grob*> > clash_groups = get_clash_groups (me);
+  Drul_array<vector<Grob *> > clash_groups = get_clash_groups (me);
 
   Direction d = UP;
   do
     {
-      for (vsize i = clash_groups[d].size (); i--; )
-       {
-         /*
-           Trigger positioning
-         */
-         clash_groups[d][i]->extent (me, X_AXIS);
-       }
+      for (vsize i = clash_groups[d].size (); i--;)
+        {
+          /*
+            Trigger positioning
+          */
+          clash_groups[d][i]->extent (me, X_AXIS);
+        }
     }
   while (flip (&d) != UP);
 
@@ -389,16 +386,16 @@ Note_collision_interface::calc_positioning_done (SCM smob)
   do
     {
       if (clash_groups[d].size ())
-       {
-         Grob *h = clash_groups[d][0];
-         Grob *fh = Note_column::first_head (h);
-         if (fh)
-           wid = fh->extent (h, X_AXIS).length ();
-       }
+        {
+          Grob *h = clash_groups[d][0];
+          Grob *fh = Note_column::first_head (h);
+          if (fh)
+            wid = fh->extent (h, X_AXIS).length ();
+        }
     }
   while (flip (&d) != UP);
 
-  vector<Grob*> done;
+  vector<Grob *> done;
   Real left_most = 1e6;
 
   vector<Real> amounts;
@@ -410,7 +407,7 @@ Note_collision_interface::calc_positioning_done (SCM smob)
       done.push_back (s);
       amounts.push_back (amount);
       if (amount < left_most)
-       left_most = amount;
+        left_most = amount;
     }
   for (; scm_is_pair (autos); autos = scm_cdr (autos))
     {
@@ -419,12 +416,12 @@ Note_collision_interface::calc_positioning_done (SCM smob)
 
       vsize x = find (done, s) - done.begin ();
       if (x == VPOS || x >= done.size ())
-       {
-         done.push_back (s);
-         amounts.push_back (amount);
-         if (amount < left_most)
-           left_most = amount;
-       }
+        {
+          done.push_back (s);
+          amounts.push_back (amount);
+          if (amount < left_most)
+            left_most = amount;
+        }
     }
 
   for (vsize i = 0; i < amounts.size (); i++)
@@ -433,28 +430,28 @@ Note_collision_interface::calc_positioning_done (SCM smob)
   return SCM_BOOL_T;
 }
 
-Drul_array < vector<Grob*> >
+Drul_array < vector<Grob *> >
 Note_collision_interface::get_clash_groups (Grob *me)
 {
-  Drul_array<vector<Grob*> > clash_groups;
+  Drul_array<vector<Grob *> > clash_groups;
 
   extract_grob_set (me, "elements", elements);
   for (vsize i = 0; i < elements.size (); i++)
     {
       Grob *se = elements[i];
       if (Note_column::has_interface (se))
-       {
-         if (!Note_column::dir (se))
-           se->programming_error ("note-column has no direction");
-         else
-           clash_groups[Note_column::dir (se)].push_back (se);
-       }
+        {
+          if (!Note_column::dir (se))
+            se->programming_error ("note-column has no direction");
+          else
+            clash_groups[Note_column::dir (se)].push_back (se);
+        }
     }
 
   Direction d = UP;
   do
     {
-      vector<Grob*> &clashes (clash_groups[d]);
+      vector<Grob *> &clashes (clash_groups[d]);
       vector_sort (clashes, Note_column::shift_less);
     }
   while ((flip (&d)) != UP);
@@ -468,7 +465,7 @@ Note_collision_interface::get_clash_groups (Grob *me)
 */
 SCM
 Note_collision_interface::automatic_shift (Grob *me,
-                                          Drul_array<vector<Grob*> > clash_groups)
+                                           Drul_array<vector<Grob *> > clash_groups)
 {
   Drul_array < vector<int> > shifts;
   SCM tups = SCM_EOL;
@@ -477,27 +474,27 @@ Note_collision_interface::automatic_shift (Grob *me,
   do
     {
       vector<int> &shift (shifts[d]);
-      vector<Grob*> &clashes (clash_groups[d]);
+      vector<Grob *> &clashes (clash_groups[d]);
 
       for (vsize i = 0; i < clashes.size (); i++)
-       {
-         SCM sh
-           = clashes[i]->get_property ("horizontal-shift");
+        {
+          SCM sh
+            = clashes[i]->get_property ("horizontal-shift");
 
-         if (scm_is_number (sh))
-           shift.push_back (scm_to_int (sh));
-         else
-           shift.push_back (0);
-       }
+          if (scm_is_number (sh))
+            shift.push_back (scm_to_int (sh));
+          else
+            shift.push_back (0);
+        }
 
       for (vsize i = 1; i < shift.size (); i++)
-       {
-         if (shift[i - 1] == shift[i])
-           {
-             clashes[0]->warning (_ ("ignoring too many clashing note columns"));
-             return tups;
-           }
-       }
+        {
+          if (shift[i - 1] == shift[i])
+            {
+              clashes[0]->warning (_ ("ignoring too many clashing note columns"));
+              return tups;
+            }
+        }
     }
   while ((flip (&d)) != UP);
 
@@ -507,13 +504,13 @@ Note_collision_interface::automatic_shift (Grob *me,
   do
     {
       for (vsize i = 0; i < clash_groups[d].size (); i++)
-       {
-         Slice s (Note_column::head_positions_interval (clash_groups[d][i]));
-         s[LEFT]--;
-         s[RIGHT]++;
-         extents[d].push_back (s);
-         offsets[d].push_back (d * 0.5 * i);
-       }
+        {
+          Slice s (Note_column::head_positions_interval (clash_groups[d][i]));
+          s[LEFT]--;
+          s[RIGHT]++;
+          extents[d].push_back (s);
+          offsets[d].push_back (d * 0.5 * i);
+        }
     }
   while ((flip (&d)) != UP);
 
@@ -529,18 +526,17 @@ Note_collision_interface::automatic_shift (Grob *me,
   do
     {
       for (vsize i = 1; i < clash_groups[d].size (); i++)
-       {
-         Slice prev = extents[d][i - 1];
-         prev.intersect (extents[d][i]);
-         if (prev.length () > 0
-             || (extents[-d].size () && d * (extents[d][i][-d] - extents[-d][0][d]) < 0))
-           for (vsize j = i; j < clash_groups[d].size (); j++)
-             offsets[d][j] += d * 0.5;
-       }
+        {
+          Slice prev = extents[d][i - 1];
+          prev.intersect (extents[d][i]);
+          if (prev.length () > 0
+              || (extents[-d].size () && d * (extents[d][i][-d] - extents[-d][0][d]) < 0))
+            for (vsize j = i; j < clash_groups[d].size (); j++)
+              offsets[d][j] += d * 0.5;
+        }
     }
   while ((flip (&d)) != UP);
 
-
   /*
     see input/regression/dot-up-voice-collision.ly
   */
@@ -550,11 +546,11 @@ Note_collision_interface::automatic_shift (Grob *me,
       Grob *dc = Note_column::dot_column (g);
 
       if (dc)
-       for (vsize j = i + 1;  j < clash_groups[UP].size (); j++)
-         {
-           Grob *stem = Note_column::get_stem (clash_groups[UP][j]);
-           Side_position_interface::add_support (dc, stem);
-         }
+        for (vsize j = i + 1; j < clash_groups[UP].size (); j++)
+          {
+            Grob *stem = Note_column::get_stem (clash_groups[UP][j]);
+            Side_position_interface::add_support (dc, stem);
+          }
     }
 
   /*
@@ -566,9 +562,9 @@ Note_collision_interface::automatic_shift (Grob *me,
   do
     {
       for (vsize i = 0; i < clash_groups[d].size (); i++)
-       tups = scm_cons (scm_cons (clash_groups[d][i]->self_scm (),
-                                  scm_from_double (offsets[d][i])),
-                        tups);
+        tups = scm_cons (scm_cons (clash_groups[d][i]->self_scm (),
+                                   scm_from_double (offsets[d][i])),
+                         tups);
     }
   while (flip (&d) != UP);
 
@@ -587,8 +583,8 @@ Note_collision_interface::forced_shift (Grob *me)
 
       SCM force = se->get_property ("force-hshift");
       if (scm_is_number (force))
-       tups = scm_cons (scm_cons (se->self_scm (), force),
-                        tups);
+        tups = scm_cons (scm_cons (se->self_scm (), force),
+                         tups);
     }
   return tups;
 }
@@ -601,15 +597,15 @@ Note_collision_interface::add_column (Grob *me, Grob *ncol)
 }
 
 ADD_INTERFACE (Note_collision_interface,
-              "An object that handles collisions between notes with"
-              " different stem directions and horizontal shifts.  Most of"
-              " the interesting properties are to be set in"
-              " @ref{note-column-interface}: these are @code{force-hshift}"
-              " and @code{horizontal-shift}.",
-
-              /* properties */
-              "merge-differently-dotted "
-              "merge-differently-headed "
-              "positioning-done "
-              "prefer-dotted-right "
-              );
+               "An object that handles collisions between notes with"
+               " different stem directions and horizontal shifts.  Most of"
+               " the interesting properties are to be set in"
+               " @ref{note-column-interface}: these are @code{force-hshift}"
+               " and @code{horizontal-shift}.",
+
+               /* properties */
+               "merge-differently-dotted "
+               "merge-differently-headed "
+               "positioning-done "
+               "prefer-dotted-right "
+              );