]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/gourlay-breaking.cc
* input/regression/tuplet-full-length-note.ly: add file.
[lilypond.git] / lily / gourlay-breaking.cc
index f9ff08b6af31337e61dca877fe825c9e5c4808ad..f5e29ad18d662463d796070a6a81cae7537f5206 100644 (file)
@@ -57,7 +57,7 @@ struct Break_node
 };
 
 void
-print_break_nodes (std::vector<Break_node> const &arr)
+print_break_nodes (vector<Break_node> const &arr)
 {
   for (vsize i = 0; i < arr.size (); i++)
     {
@@ -74,20 +74,20 @@ print_break_nodes (std::vector<Break_node> const &arr)
    TODO: should rewrite. See the function in scm/page-layout.scm for
    inspiration.
 */
-std::vector<Column_x_positions>
-Gourlay_breaking::do_solve () const
+vector<Column_x_positions>
+Gourlay_breaking::solve () 
 {
-  std::vector<Break_node> optimal_paths;
-  Link_array<Grob> all
+  vector<Break_node> optimal_paths;
+  vector<Grob*> all
     = pscore_->root_system ()->columns ();
 
-  std::vector<int> breaks = find_break_indices ();
+  vector<vsize> breaks = pscore_->find_break_indices ();
 
   Break_node first_node;
   optimal_paths.push_back (first_node);
 
-  bool ragged_right = to_boolean (pscore_->layout ()->c_variable ("raggedright"));
-  bool ragged_last = to_boolean (pscore_->layout ()->c_variable ("raggedlast"));
+  bool ragged_right = to_boolean (pscore_->layout ()->c_variable ("ragged-right"));
+  bool ragged_last = to_boolean (pscore_->layout ()->c_variable ("ragged-last"));
 
   Real worst_force = 0.0;
   for (vsize break_idx = 1; break_idx < breaks.size (); break_idx++)
@@ -104,28 +104,19 @@ Gourlay_breaking::do_solve () const
 
       for (vsize start_idx = break_idx; start_idx--;)
        {
-         Link_array<Grob> line = all.slice (breaks[start_idx],
-                                            breaks[break_idx] + 1);
-
-         line[0] = dynamic_cast<Item *> (line[0])->find_prebroken_piece (RIGHT);
-         line.back () = dynamic_cast<Item *> (line.back ())->find_prebroken_piece (LEFT);
-
-         Column_x_positions cp;
-         cp.cols_ = line;
+         vector<Grob*> line (all.begin () + breaks[start_idx],
+                             all.begin () + breaks[break_idx] + 1);
 
          Interval line_dims
            = line_dimensions_int (pscore_->layout (), optimal_paths[start_idx].line_);
-         Simple_spacer_wrapper *sp = generate_spacing_problem (line, line_dims);
          bool last_line = break_idx == breaks.size () - 1;
-         bool ragged = ragged_right
-           || (last_line && ragged_last);
-
-         sp->solve (&cp, ragged);
+         bool ragged = ragged_right || (last_line && ragged_last);
 
-         delete sp;
+         Column_x_positions cp = get_line_configuration (line, line_dims[RIGHT] - line_dims[LEFT],
+                                                         line_dims[LEFT], ragged);
 
          if (ragged && last_line)
-           cp.force_ = 0.0;
+           cp.force_ = min (cp.force_, 0.0);
 
          if (fabs (cp.force_) > worst_force)
            worst_force = fabs (cp.force_);
@@ -176,17 +167,17 @@ Gourlay_breaking::do_solve () const
       optimal_paths.push_back (bnod);
 
       if (! (break_idx % HAPPY_DOTS))
-       progress_indication (std::string ("[") + to_string (break_idx) + "]");
+       progress_indication (string ("[") + to_string (break_idx) + "]");
     }
 
   /* do the last one */
   if (breaks.size () % HAPPY_DOTS)
-    progress_indication (std::string ("[") + to_string (breaks.size ()) + "]");
+    progress_indication (string ("[") + to_string (breaks.size ()) + "]");
 
   progress_indication ("\n");
 
-  std::vector<int> final_breaks;
-  std::vector<Column_x_positions> lines;
+  vector<int> final_breaks;
+  vector<Column_x_positions> lines;
 
   /* skip 0-th element, since it is a "dummy" elt*/
   for (vsize i = optimal_paths.size () - 1; i > 0;)
@@ -236,7 +227,7 @@ Gourlay_breaking::combine_demerits (Column_x_positions const &prev,
   Grob *pc = this_one.cols_.back ();
   if (pc->original ())
     {
-      SCM pen = pc->get_property ("penalty");
+      SCM pen = pc->get_property ("line-break-penalty");
       if (scm_is_number (pen) && fabs (scm_to_double (pen)) < 10000)
        break_penalties += scm_to_double (pen);
     }