]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/tie-column.cc
* stepmake/stepmake/install-targets.make (local-uninstall): idem.
[lilypond.git] / lily / tie-column.cc
index 9b488a6f744e13cec4ca7740ee81f7923f8a3411..51bce9bc909fc4f719a5f39a3d54624f147f8ae4 100644 (file)
@@ -18,6 +18,8 @@
 #include "tie.hh"
 #include "directional-element-interface.hh"
 #include "tie-column-format.hh"
+#include "tie-formatting-problem.hh"
+#include "tie-configuration.hh"
 
 using namespace std;
 
@@ -82,82 +84,22 @@ Tie_column::calc_positioning_done (SCM smob)
   
   ties.sort (&Tie::compare);
 
-  Array<Tie_configuration> tie_configs;
-  for (int i = 0; i < ties.size (); i++)
-    {
-      Tie_configuration conf;
-      conf.dir_ = get_grob_direction (ties[i]);
-      conf.position_ = Tie::get_position (ties[i]);
-      tie_configs.push (conf);
-    }
+  Tie_formatting_problem problem;
+  problem.from_ties (ties);
 
   SCM manual_configs = me->get_property ("tie-configuration");
-  bool manual_override = false;
-  set_manual_tie_configuration (&tie_configs,
-                               &manual_override,
-                               manual_configs);
-  set_tie_config_directions (&tie_configs);
-
-  Grob *common = me;
-  for (int i = 0; i < ties.size (); i++)
-    {
-      common = dynamic_cast<Spanner*> (ties[i])->get_bound (LEFT)->common_refpoint (common, X_AXIS); 
-      common = dynamic_cast<Spanner*> (ties[i])->get_bound (RIGHT)->common_refpoint (common, X_AXIS); 
-    }
-
-  Drul_array< Array<Skyline_entry> > skylines;
-  set_chord_outlines (&skylines, ties, common);
-  
-  Tie_details details;
-  details.init (ties[0]);
-
-  /*
-    Let the ties flow out, according to our single-tie formatting.
-   */
-  if (!manual_override)
-    {
-      Tie::get_configuration (ties[0], common, &tie_configs.elem_ref (0),
-                             &skylines,
-                             details
-                             );
-      Tie::get_configuration (ties.top (), common,
-                             &tie_configs.elem_ref (tie_configs.size()-1),
-                             &skylines,
-                             details
-                             );
-    }
-
-  /*
-    Calculate final width and shape of the ties.
-   */
-  for (int i = 0; i < ties.size(); i++)
-    {
-      if (!manual_override
-         && (i == 0 || i == ties.size () -1))
-       continue;
+  problem.set_manual_tie_configuration (manual_configs);
 
 
-      final_shape_adjustment (tie_configs[i],
-                             skylines,
-                             ties[0],
-                             details);
-    }
+  Ties_configuration base = problem.generate_optimal_chord_configuration ();
 
-  
-  /*
-    Try to shift small ties into available spaces.
-   */
-  if (!manual_override)
-    {
-      shift_small_ties (&tie_configs, ties[0], details);
-    }
-  
-  for (int i = 0; i < ties.size(); i++)
+  for (int i = 0; i < base.size(); i++)
     {
-      Tie::set_control_points (ties[i], common, tie_configs[i],
-                              details
-                              );
-      set_grob_direction (ties[i], tie_configs[i].dir_);
+      Tie::set_control_points (ties[i], problem.common_x_refpoint (),
+                              base[i],
+                              problem.details_);
+      set_grob_direction (ties[i],
+                         base[i].dir_);
     }
   return SCM_BOOL_T;
 }