X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fstencil.cc;h=329c5cae61d2d85b87a41273ae9564bc6b486749;hb=8624c6220a4c6a9c3f39f330e7024cdb72fa54ce;hp=714d403638ae5d4bb8a8cfaaf32481bb9506f16b;hpb=9362fc6e2a7604cbe2dd977009e687137b5ef05a;p=lilypond.git diff --git a/lily/stencil.cc b/lily/stencil.cc index 714d403638..329c5cae61 100644 --- a/lily/stencil.cc +++ b/lily/stencil.cc @@ -3,17 +3,14 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2005 Han-Wen Nienhuys + (c) 1997--2006 Han-Wen Nienhuys */ #include "stencil.hh" -#include - -#include "dimensions.hh" +#include "main.hh" #include "font-metric.hh" -#include "input-smob.hh" -#include "libc-extension.hh" // isinf +#include "input.hh" #include "string-convert.hh" #include "warn.hh" @@ -56,12 +53,12 @@ Stencil::extent (Axis a) const return dim_[a]; } -/* Hmm... maybe this is not such a good idea ; stuff can be empty, - while expr_ == '() */ bool Stencil::is_empty () const { - return expr_ == SCM_EOL; + return (expr_ == SCM_EOL + || dim_[X_AXIS].is_empty () + || dim_[Y_AXIS].is_empty ()); } SCM @@ -81,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) { @@ -91,12 +126,14 @@ Stencil::translate (Offset o) || isnan (o[a]) // ugh, hardcoded. - || fabs (o[a]) > 1e6) + || fabs (o[a]) > 1e6) { programming_error (String_convert::form_string ("Improbable offset for stencil: %f staff space", o[a]) + "\n" + "Setting to zero."); o[a] = 0.0; + if (strict_infinity_checking) + scm_misc_error (__FUNCTION__, "Improbable offset.", SCM_EOL); } incr (a); } @@ -164,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]; @@ -190,8 +226,6 @@ Stencil::add_at_edge (Axis a, Direction d, Stencil const &s, Real padding, add_stencil (moved_to_edge (a, d, s, padding, minimum)); } - - Stencil Stencil::in_color (Real r, Real g, Real b) const {