lilypond-0.0.62
[lilypond.git] / lily / break.cc
blob8a9a426657e1b5accc6e0c9038d792fb1f7ad5b8
1 /*
2 break.cc -- implement Break_algorithm
4 source file of the LilyPond music typesetter
6 (c) 1996, 1997 Han-Wen Nienhuys <hanwen@stack.nl>
7 */
10 #include "break.hh"
11 #include "paper-def.hh"
12 #include "linespace.hh"
13 #include "debug.hh"
14 #include "scoreline.hh"
15 #include "p-score.hh"
18 /// return all breakable columns
19 Line_of_cols
20 Break_algorithm::find_breaks() const
22 Line_of_cols retval;
23 for (iter_top(pscore_.cols,c); c.ok(); c++)
24 if (c->breakable_b())
25 retval.push(c);
26 assert(retval.top() == pscore_.cols.bottom().ptr());
27 return retval;
31 Col_hpositions
32 Break_algorithm::stupid_solution(Line_of_cols curline)const
34 Spacing_problem sp;
35 sp.add_column(curline[0], true, 0.0);
36 for (int i=1; i< curline.size()-1; i++)
37 sp.add_column(curline[i]);
38 sp.add_column(curline.top(), true, linelength);
39 Col_hpositions colhpos;
40 colhpos.cols = curline;
41 colhpos.energy = INFTY;
42 colhpos.ugh_b_ = true;
43 colhpos.config = sp.try_initial_solution();
44 return colhpos;
47 /// construct an appropriate Spacing_problem and solve it.
48 Col_hpositions
49 Break_algorithm::solve_line(Line_of_cols curline) const
51 Spacing_problem sp;
53 sp.add_column(curline[0], true, 0.0);
54 for (int i=1; i< curline.size()-1; i++)
55 sp.add_column(curline[i]);
56 sp.add_column(curline.top(), true, linelength);
58 // misschien moeven uit Spacing_problem?
59 for (iter_top(pscore_.suz,i); i.ok(); i++) {
60 sp.add_ideal(i);
62 sp.prepare();
64 Array<Real> the_sol=sp.solve();
65 Col_hpositions col_hpos;
66 col_hpos.cols = curline;
67 col_hpos.energy = the_sol.pop();
68 col_hpos.config = the_sol;
69 col_hpos.error_col_l_arr_ = sp.error_pcol_l_arr();
70 col_hpos.OK();
71 return col_hpos;
74 Break_algorithm::Break_algorithm(PScore&s)
75 :pscore_(s)
77 linelength = s.paper_l_->linewidth;
80 bool
81 Break_algorithm::feasible(Line_of_cols curline) const
83 Real l =0;
84 for (int i=0; i < curline.size(); i++)
85 l +=curline[i]->width().length();
86 return l < linelength;
89 void
90 Break_algorithm::problem_OK() const
92 if (!pscore_.cols.size())
93 error("Score does not have any columns");
94 #ifndef NDEBUG
95 iter_top(pscore_.cols,start);
96 PCursor<PCol *> end (pscore_.cols.bottom());
98 assert(start->breakable_b());
99 assert(end->breakable_b());
100 #endif