2 p-score.cc -- implement PScore
4 source file of the GNU LilyPond music typesetter
6 (c) 1996, 1997 Han-Wen Nienhuys <hanwen@stack.nl>
9 #include "super-elem.hh"
10 #include "idealspacing.hh"
14 #include "paper-def.hh"
15 #include "scoreline.hh"
17 #include "tex-stream.hh"
22 PScore::typeset_element(Score_elem * elem_p)
24 elem_p_list_.bottom().add(elem_p);
25 elem_p->pscore_l_ = this;
26 elem_p->add_processing();
30 PScore::typeset_item(Item *i, PCol *c, int breakstat)
35 typeset_item(i, c->prebreak_p_);
40 typeset_item(i, c->postbreak_p_);
49 PScore::typeset_broken_spanner(Spanner*span_p)
51 span_p->left_col_l_->starters.bottom().add (span_p);
52 span_p->right_col_l_->stoppers.bottom().add(span_p);
53 assert(span_p->left_col_l_->line_l_ == span_p->right_col_l_->line_l_);
55 typeset_element(span_p);
60 PScore::typeset_unbroken_spanner(Spanner*span_p)
62 spanners.bottom().add(span_p);
63 span_p->pscore_l_=this;
64 // do not init start/stop fields. These are for broken spans only.
65 span_p->add_processing();
69 PScore::get_spacing(PCol*l, PCol*r)
73 Idealspacing*i_p =new Idealspacing(l,r);
74 suz.bottom().add(i_p);
84 for (iter_top(cols,c); c.ok(); )
88 c->set_rank(rank_i++);
94 PScore::do_connect(PCol *c1, PCol *c2, Real d, Real h)
98 Idealspacing*s_l=get_spacing(c1,c2);
106 PScore::connect(PCol* c1, PCol *c2, Real d, Real h)
108 do_connect(c1,c2,d,h);
109 do_connect(c1->postbreak_p_, c2,d,h);
110 do_connect(c1, c2->prebreak_p_,d,h);
111 do_connect(c1->postbreak_p_, c2->prebreak_p_,d,h);
118 if (p->breakable_b()){
119 p->prebreak_p_->pscore_l_ = this;
120 p->postbreak_p_->pscore_l_ = this;
122 cols.bottom().add(p);
125 PScore::PScore(Paper_def*p)
128 super_elem_l_ = new Super_elem;
129 typeset_element(super_elem_l_);
133 PScore::output(Tex_stream &ts)
135 ts << "\n "<< paper_l_->lookup_l()->texsetting << "%(Tex id)\n";
136 ts<< super_elem_l_->TeX_string();
137 ts << "\n\\EndLilyPondOutput";
143 super_elem_l_->unlink_all();
150 for (iter_top(cols,cc); cc.ok(); cc++)
152 for (iter_top(suz,i); i.ok(); i++)
158 PScore::print() const
163 mtor << "\n elements: ";
164 for (iter_top(elem_p_list_,cc); cc.ok(); cc++)
166 mtor << "\ncolumns: ";
167 for (iter_top(cols,cc); cc.ok(); cc++)
170 mtor << "\nideals: ";
171 for (iter_top(suz,i); i.ok(); i++)
180 super_elem_l_->pre_processing();
184 PScore::postprocess()
186 super_elem_l_->post_processing();
187 super_elem_l_->molecule_processing();
191 PScore::find_col(PCol const *c)const
193 PCol const *what = c;
195 what = what->daddy_l_;
197 return cols.find((PCol*)what);
202 PScore::set_breaking(Array<Col_hpositions> const &breaking)
204 super_elem_l_->line_of_score_l_->set_breaking( breaking);
205 super_elem_l_->break_processing();
208 for (iter_top(spanners,i); i.ok(); ) {
209 Spanner *span_p = i.remove_p();
210 if (span_p->broken_b()) {
214 typeset_broken_spanner(span_p);
220 PScore::calc_breaking()
223 set_breaking(w.solve());
231 *mlog << "Preprocessing elements... " <<flush;
233 *mlog << "\nCalculating column positions ... " <<flush;
235 *mlog << "\nPostprocessing elements..." << endl;
238 /** Get all breakable columns between l and r, (not counting l and r). */
240 PScore::breakable_col_range(PCol*l,PCol*r)const
242 Link_array<PCol> ret;
244 PCursor<PCol*> start(l ? find_col(l)+1 : cols.top() );
245 PCursor<PCol*> stop(r ? find_col(r) : cols.bottom());
248 ugh! windows-suck-suck-suck.
250 while ( PCursor<PCol*>::compare(start,stop) < 0 ) {
251 if (start->breakable_b())
259 PScore::col_range(PCol*l,PCol*r)const
261 Link_array<PCol> ret;
263 PCursor<PCol*> start(l ? find_col(l)+1 : cols.top() );
264 PCursor<PCol*> stop(r ? find_col(r) : cols.bottom());
268 ugh! windows-suck-suck-suck.
270 while ( PCursor<PCol*>::compare(start,stop) < 0 )
277 PScore::broken_col_range(PCol*l,PCol*r)const
279 Link_array<PCol> ret;
281 PCursor<PCol*> start(l ? find_col(l)+1 : cols.top() );
282 PCursor<PCol*> stop(r ? find_col(r) : cols.bottom());
285 ugh! windows-suck-suck-suck.
287 while ( PCursor<PCol*>::compare(start,stop) < 0 ) {
288 if (start->breakable_b() && !start->line_l_ )