#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;
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;
}