4 #include "paper-def.hh"
14 Stem::Stem(int c) //, Moment len)
18 minnote = 1000; // invalid values
29 IMPLEMENT_STATIC_NAME(Stem);
32 Stem::do_print() const
35 mtor << "flag "<< flag << " print_flag " << print_flag
36 << "min,max [" << minnote << ", " << maxnote << "]";
40 Stem::set_stemend(Real se)
44 if (! ((dir > 0 && se >= maxnote) || (se <= minnote && dir <0)) )
45 warning("Weird stem size; check for narrow beams",0);
47 top = (dir < 0) ? maxnote : se;
48 bot = (dir < 0) ? se : minnote;
53 Stem::add(Notehead *n)
55 assert(status < PRECALCED);
65 n->add_dependency(this);
70 Stem::get_default_dir()
74 Real mean = (minnote+maxnote)/2;
75 return (mean > staff_center) ? -1: 1;
79 Stem::set_default_dir()
81 dir = get_default_dir();
85 Stem::set_default_stemlen()
90 int stafftop = 2*staff_center;
91 stemlen = STEMLEN + (maxnote - minnote);
93 // uhh... how about non 5-line staffs?
94 if (maxnote < -2 && dir == 1){
95 int t = staff_center - staff_center/2;
96 stemlen = t - minnote +2;
97 } else if (minnote > stafftop + 2 && dir == -1) {
98 int t = staff_center + staff_center/2;
99 stemlen = maxnote -t +2;
107 Stem::set_default_extents()
109 if (minnote > maxnote) {
110 warning("Empty stem. Ugh!", 0);
116 set_default_stemlen();
118 set_stemend((dir< 0) ? maxnote-stemlen: minnote +stemlen);
120 stem_xoffset = paper()->note_width()-paper()->rule_thickness();
126 Stem::set_noteheads()
130 heads.sort(Notehead::compare);
131 heads[0]->extremal = -1;
132 heads.top()->extremal = 1;
134 int lastpos = heads[0]->position;
135 for (int i=1; i < heads.size(); i ++) {
136 int dy =abs(lastpos- heads[i]->position);
140 heads[i]->x_dir = (stem_xoffset>0) ? 1:-1;
144 lastpos = heads[i]->position;
149 Stem::do_pre_processing()
152 set_default_extents();
160 if (!print_flag || abs(flag) <= 4)
161 return Interval(0,0); // TODO!
162 Paper_def*p= paper();
163 Interval r(p->lookup_l()->flag(flag).dim.x);
169 Stem::brew_molecule_p()const return out;
174 Paper_def *p =paper();
176 Real dy = p->internote();
177 Symbol ss =p->lookup_l()->stem(bot*dy,top*dy);
180 out = new Molecule(Atom(ss));
182 if (print_flag&&abs(flag) > 4){
183 Symbol fl = p->lookup_l()->flag(flag);
187 } else if (flag > 4) {
193 out->translate(Offset(stem_xoffset,0));
199 return pcol_l_->hpos + stem_xoffset; // hmm. + offset_.x;