- if (oi && dynamic_cast<Rhythmic_head *> (oi))
- head_l_arr_.substitute (dynamic_cast<Rhythmic_head*> (oi),
- dynamic_cast<Rhythmic_head*>(n));
- else if (oi && dynamic_cast<Dots *> (oi))
- dot_l_arr_.substitute (dynamic_cast<Dots*> (oi),
- dynamic_cast<Dots*> (n));
+ if (dots.size () < 2)
+ return SCM_UNSPECIFIED;
+ Slice s;
+ s.set_empty ();
+
+ Array<int> taken_posns;
+ int conflicts = 0;
+ for (int i=0; i < dots.size (); i++)
+ {
+ Real p = Staff_symbol_referencer::position_f (dots[i]);
+ for (int j=0; j < taken_posns.size (); j++)
+ {
+ if (taken_posns[j] == (int) p)
+ conflicts++;
+ }
+ taken_posns.push ((int)p);
+ s.unite (Slice ((int)p,
+ (int)p));
+ }
+
+ if (!conflicts)
+ return SCM_UNSPECIFIED;
+
+ int middle = s.center ();
+ /*
+ +1 -> off by one
+ */
+ int pos = middle - dots.size () + 1;
+ if (! (pos % 2))
+ pos ++; // center () rounds down.
+
+ for (int i=0; i < dots.size (); pos += 2, i++)
+ {
+ Grob * d = dots[i];
+ Staff_symbol_referencer::set_position (d,pos);
+ }
+
+ return SCM_UNSPECIFIED;