source file of the GNU LilyPond music typesetter
- (c) 1997--2005 Han-Wen Nienhuys <hanwen@cs.uu.nl>
+ (c) 1997--2006 Han-Wen Nienhuys <hanwen@xs4all.nl>
*/
#include "gourlay-breaking.hh"
#include <cstdio>
using namespace std;
-#include "warn.hh"
+#include "international.hh"
#include "main.hh"
+#include "output-def.hh"
#include "paper-column.hh"
#include "paper-score.hh"
-#include "output-def.hh"
#include "simple-spacer.hh"
#include "system.hh"
+#include "warn.hh"
/// How often to print operator pacification marks?
-const int HAPPY_DOTS_I = 3;
+const int HAPPY_DOTS = 3;
/**
Helper to trace back an optimal path
};
void
-print_break_nodes (Array<Break_node> const &arr)
+print_break_nodes (vector<Break_node> const &arr)
{
- for (int i = 0; i < arr.size (); i++)
+ for (vsize i = 0; i < arr.size (); i++)
{
printf ("node %d: ", i);
arr[i].print ();
TODO: should rewrite. See the function in scm/page-layout.scm for
inspiration.
*/
-Array<Column_x_positions>
-Gourlay_breaking::do_solve () const
+vector<Column_x_positions>
+Gourlay_breaking::solve ()
{
- Array<Break_node> optimal_paths;
- Link_array<Grob> all
+ vector<Break_node> optimal_paths;
+ vector<Grob*> all
= pscore_->root_system ()->columns ();
- Array<int> breaks = find_break_indices ();
+ vector<int> breaks = pscore_->find_break_indices ();
Break_node first_node;
- optimal_paths.push (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 (int break_idx = 1; break_idx < breaks.size (); break_idx++)
+ for (vsize break_idx = 1; break_idx < breaks.size (); break_idx++)
{
/*
start with a short line, add measures. At some point
Real minimal_demerits = infinity_f;
- for (int start_idx = break_idx; start_idx--;)
+ for (vsize start_idx = break_idx; start_idx--;)
{
- Link_array<Grob> line = all.slice (breaks[start_idx], breaks[break_idx] + 1);
+ vector<Grob*> line (all.begin () + breaks[start_idx],
+ all.begin () + breaks[break_idx] + 1);
line[0] = dynamic_cast<Item *> (line[0])->find_prebroken_piece (RIGHT);
- line.top () = dynamic_cast<Item *> (line.top ())->find_prebroken_piece (LEFT);
+ line.back () = dynamic_cast<Item *> (line.back ())->find_prebroken_piece (LEFT);
Column_x_positions cp;
cp.cols_ = line;
bnod.line_config_ = minimal_sol;
}
bnod.line_ = optimal_paths[bnod.prev_break_].line_ + 1;
- optimal_paths.push (bnod);
+ optimal_paths.push_back (bnod);
- if (! (break_idx % HAPPY_DOTS_I))
- progress_indication (String ("[") + to_string (break_idx) + "]");
+ if (! (break_idx % HAPPY_DOTS))
+ progress_indication (string ("[") + to_string (break_idx) + "]");
}
/* do the last one */
- if (breaks.size () % HAPPY_DOTS_I)
- progress_indication (String ("[") + to_string (breaks.size ()) + "]");
+ if (breaks.size () % HAPPY_DOTS)
+ progress_indication (string ("[") + to_string (breaks.size ()) + "]");
progress_indication ("\n");
- Array<int> final_breaks;
- Array<Column_x_positions> lines;
+ vector<int> final_breaks;
+ vector<Column_x_positions> lines;
/* skip 0-th element, since it is a "dummy" elt*/
- for (int i = optimal_paths.size () - 1; i > 0;)
+ for (vsize i = optimal_paths.size () - 1; i > 0;)
{
- final_breaks.push (i);
- int prev = optimal_paths[i].prev_break_;
+ final_breaks.push_back (i);
+ vsize prev = optimal_paths[i].prev_break_;
assert (i > prev);
i = prev;
}
if (be_verbose_global)
{
message (_f ("Optimal demerits: %f",
- optimal_paths.top ().demerits_) + "\n");
+ optimal_paths.back ().demerits_) + "\n");
}
- if (optimal_paths.top ().demerits_ >= infinity_f)
+ if (optimal_paths.back ().demerits_ >= infinity_f)
warning (_ ("no feasible line breaking found"));
- for (int i = final_breaks.size (); i--;)
+ for (vsize i = final_breaks.size (); i--;)
{
Column_x_positions cp (optimal_paths[final_breaks[i]].line_config_);
- lines.push (cp);
+ lines.push_back (cp);
if (!cp.satisfies_constraints_)
warning (_ ("can't find line breaking that satisfies constraints"));
}
Column_x_positions const &this_one) const
{
Real break_penalties = 0.0;
- Grob *pc = this_one.cols_.top ();
- if (pc->original_)
+ Grob *pc = this_one.cols_.back ();
+ if (pc->original ())
{
SCM pen = pc->get_property ("penalty");
if (scm_is_number (pen) && fabs (scm_to_double (pen)) < 10000)