source file of the GNU LilyPond music typesetter
- (c) 1997--2006 Han-Wen Nienhuys <hanwen@xs4all.nl>
+ (c) 1997--2007 Han-Wen Nienhuys <hanwen@xs4all.nl>
*/
#include "stencil.hh"
{
return dim_;
}
-Offset
-Stencil::origin () const
+
+void
+Stencil::rotate (Real a, Offset off)
{
- return origin_;
+ rotate_degrees (a * 180/M_PI, off);
}
/*
- * Rotate this stencil around the point [x, y]
+ Rotate this stencil around the point RELATIVE_OFF.
+
+ RELATIVE_OFF is measured in terms of the extent of the stencil, so
+ -1 = LEFT/DOWN edge, 1 = RIGHT/UP edge.
*/
void
-Stencil::rotate (Real a, Offset off)
+Stencil::rotate_degrees (Real a, Offset relative_off)
{
const Real x_cen = extent (X_AXIS).center ();
const Real y_cen = extent (Y_AXIS).center ();
/*
* Calculate the center of rotation
*/
- const Real x = x_cen + off[X_AXIS] * x_cen;
- const Real y = y_cen + off[Y_AXIS] * y_cen;
+ const Real x = x_cen + relative_off[X_AXIS] * x_cen;
+ const Real y = y_cen + relative_off[Y_AXIS] * y_cen;
/*
* Build scheme expression (processed in stencil-interpret.cc)
expr_, SCM_UNDEFINED);
if (!is_empty ())
dim_.translate (o);
- origin_ += o;
}
void
translate_axis (-i.linear_combination (x), a);
}
-/* FIXME: unintuitive naming, you would expect *this to be moved.
- Kept (keeping?) API for compat with add_at_edge ().
-
- What is PADDING, what is MINIMUM, exactly? */
-Stencil
-Stencil::moved_to_edge (Axis a, Direction d, Stencil const &s,
- Real padding, Real minimum) const
+/* See scheme Function. */
+void
+Stencil::add_at_edge (Axis a, Direction d, Stencil const &s, Real padding)
{
Interval my_extent = dim_[a];
Interval i (s.extent (a));
Real his_extent;
if (i.is_empty ())
{
- programming_error ("Stencil::moved_to_edge: adding empty stencil.");
+ programming_error ("Stencil::add_at_edge: adding empty stencil.");
his_extent = 0.0;
}
else
Stencil toadd (s);
toadd.translate_axis (offset, a);
-
- if (minimum > 0 && d * (-origin ()[a] + toadd.origin ()[a]) < minimum)
- toadd.translate_axis (-toadd.origin ()[a]
- + origin ()[a] + d * minimum, a);
-
- return toadd;
-}
-
-/* See scheme Function. */
-void
-Stencil::add_at_edge (Axis a, Direction d, Stencil const &s, Real padding,
- Real minimum)
-{
- add_stencil (moved_to_edge (a, d, s, padding, minimum));
+ add_stencil (toadd);
}
Stencil
expr ()));
return new_stencil;
}
+
+/* convenience */
+Stencil
+Stencil::translated (Offset z) const
+{
+ Stencil s (*this);
+ s.translate (z);
+ return s;
+}