X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;ds=sidebyside;f=lily%2Fstencil.cc;h=294894d5f196a45e5e07e059d33e8bf0957a93e6;hb=1c43641c240c896489997913515211668cde7e2c;hp=9083737560bf5aeaa0ac9e07f70342bedc6afe37;hpb=545092a25d8ca41dc90b87482474b3719f7130a9;p=lilypond.git diff --git a/lily/stencil.cc b/lily/stencil.cc index 9083737560..294894d5f1 100644 --- a/lily/stencil.cc +++ b/lily/stencil.cc @@ -3,13 +3,12 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2005 Han-Wen Nienhuys + (c) 1997--2006 Han-Wen Nienhuys */ #include "stencil.hh" - -#include "dimensions.hh" +#include "main.hh" #include "font-metric.hh" #include "input-smob.hh" #include "string-convert.hh" @@ -79,6 +78,44 @@ Stencil::origin () const return origin_; } +/* + * Rotate this stencil around the point [x, y] + */ +void +Stencil::rotate (Real a, Offset 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; + + /* + * Build scheme expression (processed in stencil-interpret.cc) + */ + expr_ = scm_list_n (ly_symbol2scm ("rotate-stencil"), + scm_list_2 (scm_from_double (a), + scm_cons (scm_from_double (x), scm_from_double (y))), + expr_, SCM_UNDEFINED); + + /* + * Calculate the new bounding box + */ + vector pts; + pts.push_back (Offset (-x_cen, -y_cen)); + pts.push_back (Offset (x_cen, -y_cen)); + pts.push_back (Offset (x_cen, y_cen)); + pts.push_back (Offset (-x_cen, y_cen)); + + const Offset rot = complex_exp (Offset (0, a * M_PI / 180.0)); + dim_.set_empty (); + for (vsize i = 0; i < pts.size (); i++) + dim_.add_point (pts[i] * rot + Offset (x_cen, y_cen)); +} + void Stencil::translate (Offset o) { @@ -95,6 +132,8 @@ Stencil::translate (Offset o) + "\n" + "Setting to zero."); o[a] = 0.0; + if (strict_infinity_checking) + scm_misc_error (__FUNCTION__, "Improbable offset.", SCM_EOL); } incr (a); } @@ -162,7 +201,6 @@ Stencil::moved_to_edge (Axis a, Direction d, Stencil const &s, { programming_error ("Stencil::moved_to_edge: adding empty stencil."); his_extent = 0.0; - // SCM_ASSERT_TYPE (0, s.expr (), SCM_ARG1, __FUNCTION__, "non-empty stencil"); } else his_extent = i[-d];