#include "lookup.hh"
#include "molecule.hh"
#include "pcol.hh"
+#include "misc.hh"
const int STEMLEN=7;
-static int
-ABS(int i) {
- return (i < 0)?-i:i;
-}
-
-
-Stem::Stem(int c)
+NAME_METHOD(Stem);
+Stem::Stem(int c) //, Moment len)
{
+// note_length = len;
+ beams_left = 0;
+ beams_right = 0;
minnote = 1000; // invalid values
maxnote = -1000;
bot = top = 0;
stem_xoffset=0;
}
-
+void
+Stem::do_print() const
+{
+#ifndef NPRINT
+ mtor << "flag "<< flag << " print_flag " << print_flag
+ << "min,max [" << minnote << ", " << maxnote << "]";
+#endif
+}
void
Stem::set_stemend(Real se)
{
+
// todo: margins
- assert((dir > 0 && se >= maxnote) || (se <= minnote && dir <0));
+ if (! ((dir > 0 && se >= maxnote) || (se <= minnote && dir <0)) )
+ WARN << "Weird stem size; check for narrow beams.\n";
top = (dir < 0) ? maxnote : se;
bot = (dir < 0) ? se : minnote;
- flag = dir*ABS(flag);
+ flag = dir*abs(flag);
}
void
Stem::add(Notehead *n)
{
+ assert(status < PRECALCED);
+
if (n->balltype == 1)
return;
int p = n->position;
minnote = p;
if ( p> maxnote)
maxnote = p;
+ heads.push(n);
+ n->dependencies.push(this);
}
-void
-Stem::print()const
+
+
+int
+Stem::get_default_dir()
{
- mtor << "Stem minmax=["<< minnote<<","<<maxnote<<"], flag: "<<flag;
- Item::print();
+ if (dir)
+ return dir;
+ Real mean = (minnote+maxnote)/2;
+ return (mean > staff_center) ? -1: 1;
}
-
void
Stem::set_default_dir()
{
- Real mean = (minnote+maxnote)/2;
- dir = (mean > staff_center) ? -1: 1;
+ dir = get_default_dir();
}
-
void
Stem::set_default_stemlen()
{
set_stemend((dir< 0) ? maxnote-stemlen: minnote +stemlen);
if (dir > 0){
stem_xoffset = paper()->note_width();
+ } else
+ stem_xoffset = 0;
+}
+
+void
+Stem::set_noteheads()
+{
+ heads.sort(Notehead::compare);
+ heads[0]->extremal = -1;
+ heads.last()->extremal = 1;
+ int parity=1;
+ int lastpos = heads[0]->position;
+ for (int i=1; i < heads.size(); i ++) {
+ int dy =abs(lastpos- heads[i]->position);
+
+ if (dy <= 1) {
+ if (parity)
+ heads[i]->x_dir = (stem_xoffset>0) ? 1:-1;
+ parity = !parity;
+ } else
+ parity = 0;
+ lastpos = heads[i]->position;
}
}
void
-Stem::postprocess()
+Stem::do_pre_processing()
{
- set_default_extents();
- brew_molecole();
+ if (bot == top)
+ set_default_extents();
+ set_noteheads();
}
+
Interval
Stem::width()const
{
- if (!print_flag || ABS(flag) <= 4)
+ if (!print_flag || abs(flag) <= 4)
return Interval(0,0); // TODO!
Paperdef*p= paper();
- Interval r(p->lookup_->flag(flag).dim.x);
+ Interval r(p->lookup_p_->flag(flag).dim.x);
r+= stem_xoffset;
return r;
}
-void
-Stem::brew_molecole()
+Molecule*
+Stem::brew_molecule_p()const return out;
{
- assert(pstaff_);
assert(bot!=top);
- assert(!output);
+
Paperdef *p =paper();
- Parametric_symbol *stem = p->lookup_->stem();
-
- Real dy = p->interline()/2;
- String y1 =print_dimen( dy * bot);
- String y2 = print_dimen(dy * top);
- Symbol ss =stem->eval(y1,y2);
- delete stem;
+
+ Real dy = p->internote();
+ Symbol ss =p->lookup_p_->stem(bot*dy,top*dy);
+
- output = new Molecule(Atom(ss));
+ out = new Molecule(Atom(ss));
- if (print_flag&&ABS(flag) > 4){
- Symbol fl = p->lookup_->flag(flag);
+ if (print_flag&&abs(flag) > 4){
+ Symbol fl = p->lookup_p_->flag(flag);
Molecule m(fl);
if (flag < -4){
- output->add_bot(m);
+ out->add_bottom(m);
} else if (flag > 4) {
- output->add_top(m);
+ out->add_top(m);
} else
assert(false);
}
- output->translate(Offset(stem_xoffset,0));
-
+ out->translate(Offset(stem_xoffset,0));
}
Real
Stem::hpos()const
{
- return pcol_->hpos + stem_xoffset;
+ return pcol_l_->hpos + stem_xoffset;
}
-void
-Stem::preprocess()
-{
-
-}