]> git.donarmstrong.com Git - lilypond.git/blob - lily/break.cc
release: 0.0.65
[lilypond.git] / lily / break.cc
1 /*
2   break.cc -- implement Break_algorithm
3
4   source file of the GNU LilyPond music typesetter
5
6   (c) 1996, 1997 Han-Wen Nienhuys <hanwen@stack.nl>
7 */
8
9
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"
16 #include "p-col.hh"
17
18 ///  return all breakable columns
19 Line_of_cols
20 Break_algorithm::find_breaks() const
21 {
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;
28 }
29
30
31 Col_hpositions
32 Break_algorithm::stupid_solution(Line_of_cols curline)const
33 {
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;
45 }
46
47 /// construct an appropriate Spacing_problem and solve it. 
48 Col_hpositions
49 Break_algorithm::solve_line(Line_of_cols curline) const
50 {
51    Spacing_problem sp;
52
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);
57
58    // misschien  moeven uit Spacing_problem? 
59    for (iter_top(pscore_.suz,i); i.ok(); i++) {
60        sp.add_ideal(i);
61    }
62    sp.prepare();
63    
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;
72 }
73
74 Break_algorithm::Break_algorithm(PScore&s)
75     :pscore_(s)
76 {
77     linelength = s.paper_l_->linewidth;
78 }
79
80 bool
81 Break_algorithm::feasible(Line_of_cols curline) const
82 {
83     Real l =0;
84     for (int i=0; i < curline.size(); i++)
85         l +=curline[i]->width().length();
86     return l < linelength;    
87 }
88
89 void
90 Break_algorithm::problem_OK() const
91 {
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());
97     
98     assert(start->breakable_b());    
99     assert(end->breakable_b());
100 #endif
101 }