source file of the GNU LilyPond music typesetter
- (c) 1997 Han-Wen Nienhuys <hanwen@stack.nl>
+ (c) 1997--1999 Han-Wen Nienhuys <hanwen@cs.uu.nl>
+ Jan Nieuwenhuizen <janneke@gnu.org>
*/
#include <math.h>
-#include "item.hh"
#include "misc.hh"
-#include "moment.hh"
+
+#ifndef STANDALONE
+#include "item.hh"
+#endif
int
intlog2(int d) {
return log (x) /log (2.0);
}
-#if 1
+#ifndef STANDALONE
Interval
itemlist_width (const Array<Item*> &its)
{
for (int j =0; j < its.size(); j++)
{
- iv.unite (its[j]->width());
+ iv.unite (its[j]->extent (X_AXIS));
}
return iv;
}
#endif
+
+
+/*
+ TODO
+ group in some Array_*
+ make more generic / templatise
+ */
+int
+get_lower_bound (Array<Real> const& positions, Real x)
+{
+ if (x < positions[0])
+ return 0;
+ for (int i = 1; i < positions.size (); i++)
+ if (x < positions[i])
+ return i - 1;
+ return positions.size () - 1;
+}
+
+Slice
+get_bounds_slice (Array<Real> const& positions, Real x)
+{
+ int l = get_lower_bound (positions, x);
+ int u = positions.size () - 1 <? l + 1;
+ if (x < positions[l])
+ u = l;
+ return Slice (l, u);
+}
+
+Interval
+get_bounds_iv (Array<Real> const& positions, Real x)
+{
+ Slice slice = get_bounds_slice (positions, x);
+ return Interval (positions[slice[SMALLER]], positions[slice[BIGGER]]);
+}
+
+// silly name
+Interval
+quantise_iv (Array<Real> const& positions, Real period, Real x)
+{
+ /*
+ ugh
+ assume that
+ * positions are sorted,
+ * positions are nonnegative
+ * period starts at zero
+ */
+
+ int n = (int)(x / period);
+ Real frac = (x / period - n) * period;
+ if (frac < 0)
+ {
+ frac += period;
+ n--;
+ }
+
+ Slice slice = get_bounds_slice (positions, frac);
+ Interval iv(positions[slice[SMALLER]], positions[slice[BIGGER]]);
+
+ if (slice[SMALLER] == slice[BIGGER])
+ {
+ if (slice[SMALLER] == 0)
+ iv[SMALLER] = - period + positions.top ();
+ else
+ iv[BIGGER] = period + positions[0];
+ }
+
+ iv += period * n;
+
+ return iv;
+}