]> git.donarmstrong.com Git - lilypond.git/blob - src/staffline.cc
release: 0.0.18
[lilypond.git] / src / staffline.cc
1 #include "staffline.hh"
2 #include "scoreline.hh"
3 #include "dimen.hh"
4 #include "spanner.hh"
5 #include "symbol.hh"
6 #include "paper.hh"
7 #include "molecule.hh"
8 #include "pcol.hh"
9 #include "pscore.hh"
10
11 static String
12 make_vbox(Interval i)
13 {    
14     String s("\\vbox to ");
15     s += print_dimen(i.length());
16     s += "{\\vskip "+print_dimen(i.max)+" ";
17     return s;
18 }
19
20     
21 String
22 Line_of_staff::TeXstring() const
23 {
24     String s("%line_of_staff\n");
25     s+=make_vbox(height());
26     // the staff itself: eg lines, accolades
27     s += "\\hbox{";
28     {                           
29         ((PStaff*)pstaff_)->
30             brew_molecule(line_of_score_->pscore_->paper_->linewidth);
31
32         s+=pstaff_->stafsym->TeXstring();
33         PCursor<const PCol *> cc(line_of_score_->cols);
34         Real lastpos=cc->hpos;
35
36         // all items in the current line & staff.
37         for (; cc.ok(); cc++) {
38             Real delta=cc->hpos - lastpos;
39             lastpos = cc->hpos;
40
41             // moveover
42             if (delta)
43                 s +=String( "\\kern ") + print_dimen(delta);
44
45             // now output the items.
46
47             for (PCursor<const Item *> ic(cc->its); ic.ok(); ic++) {
48                 if (ic->pstaff_ == pstaff_)
49                     s += ic->TeXstring();
50             }
51             // spanners.
52             for (PCursor<const Spanner *> sc(cc->starters); sc.ok(); sc++)
53                 if (sc->pstaff_ == pstaff_)
54                     s += sc->TeXstring();
55         }
56     }
57     s+="\\hss}\\vss}";
58     return s;
59 }
60
61 Line_of_staff::Line_of_staff(Line_of_score * sc, PStaff*st)
62 {
63     line_of_score_=sc;
64     pstaff_=st;
65
66     
67     PCol *linestart = sc->cols.top();
68     PCol *linestop = sc->cols.bottom();
69
70     
71     for (PCursor<const Spanner*> sp(pstaff_->spans); sp.ok(); sp++) {
72         PCol *brokenstart = &MAX(*linestart, *sp->left);
73         PCol *brokenstop = &MIN(*linestop, *sp->right);
74         if ( *brokenstart < *brokenstop) {
75             line_of_score_->pscore_-> // higghl
76                 add_broken(sp->broken_at(brokenstart,brokenstop));
77         }
78     }
79 }
80
81
82 Interval
83 Line_of_staff::height() const
84 {
85     Interval y;
86     {
87         y = pstaff_->stafsym->extent().y;
88     }
89     PCursor<const PCol *> cc(line_of_score_->cols);
90     
91     // all items in the current line & staff.
92     for (; cc.ok(); cc++) {
93         for (PCursor<const Item *> ic(cc->its); ic.ok(); ic++) {
94             if (ic->pstaff_ == pstaff_) {
95                 y.unite(ic->height());
96         }
97             
98         // spanners.
99         for (PCursor<const Spanner *> sc(cc->starters); sc.ok(); sc++)
100             if (sc->pstaff_ == pstaff_) {
101                 y.unite(sc->height());
102             }
103         }
104     }
105     return y;
106 }
107
108 void
109 Line_of_staff::process()
110 {
111     if (!pstaff_->stafsym)
112         pstaff_->brew_molecule(line_of_score_->pscore_->
113                                paper_->linewidth);
114 }