#include "stem.hh"
#include "paper.hh"
#include "lookup.hh"
-#include "scalar.hh"
-
+#include "grouping.hh"
struct Stem_info {
Real x;
{
x = s->hpos();
int dir = s->dir;
- idealy = MAX(dir*s->top, dir*s->bot);
- miny = MAX(dir*s->minnote, dir*s-> maxnote);
+ idealy = max(dir*s->top, dir*s->bot);
+ miny = max(dir*s->minnote, dir*s-> maxnote);
assert(miny <= idealy);
no_beams = s->flag;
}
/****************/
+Offset
+Beam::center()const
+{
+ if(!dir)
+ ((Beam*)this)->calculate();
+ Real w=width().length()/2;
+ return Offset(w,
+ (left_pos + w* slope)*paper()->interline());
+}
+
Beam::Beam()
{
+ group = 0;
slope = 0;
left_pos = 0.0;
dir =0;
solve_slope();
}
-
void
Beam::process()
{
calculate();
- /*
- quick and dirty!
- */
- for (PCursor<Stem*> i(stems); i.ok(); i++)
- i->beams_left = i->beams_right = intlog2(ABS(i->flag)) - 2;
-
- stems.top()->beams_left = 0;
- stems.bottom()->beams_right = 0;
-
brew_molecule();
set_stemlens();
}
+void
+Beam::set_grouping(Rhythmic_grouping def, Rhythmic_grouping cur)
+{
+ def.OK();
+ cur.OK();
+ assert(cur.children.sz() == stems.size());
+
+ cur.split(def);
+ group = new Rhythmic_grouping(cur);
+ svec<int> b;
+ {
+ PCursor<Stem*> s(stems);
+ svec<int> flags;
+ for (; s.ok(); s++) {
+ int f = intlog2(abs(s->flag))-2;
+ assert(f>0);
+ flags.add(f);
+ }
+ int fi =0;
+ b= group->generate_beams(flags, fi);
+ b.insert(0,0);
+ b.add(0);
+ assert(stems.size() == b.sz()/2);
+ }
+
+ PCursor<Stem*> s(stems);
+ for (int i=0; i < b.sz() && s.ok(); i+=2, s++) {
+ s->beams_left = b[i];
+ s->beams_right = b[i+1];
+ }
+}
+
// todo.
Spanner *
#endif
}
+Beam::~Beam()
+{
+ delete group;
+}