X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;ds=sidebyside;f=lily%2Fmolecule.cc;h=6a9af3d3550189703d1d9a20d3622042c2eba780;hb=a73704817cffadad65b2a9842a499cb6aac6eb5e;hp=5f1ced7f4975288518cf265a6b7d8a51b24909e8;hpb=9cf00174c8273860064dc7ccb51beddcdd7105eb;p=lilypond.git diff --git a/lily/molecule.cc b/lily/molecule.cc index 5f1ced7f49..6a9af3d355 100644 --- a/lily/molecule.cc +++ b/lily/molecule.cc @@ -3,11 +3,11 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2001 Han-Wen Nienhuys + (c) 1997--2002 Han-Wen Nienhuys */ #include -#include +#include // isinf #include "font-metric.hh" #include "dimensions.hh" @@ -15,7 +15,7 @@ #include "string.hh" #include "molecule.hh" #include "debug.hh" -#include "killing-cons.tcc" + #include "ly-smobs.icc" @@ -52,7 +52,7 @@ Molecule::translate (Offset o) Axis a = X_AXIS; while (a < NO_AXES) { - if (abs (o[a]) > 30 CM + if (abs (o[a]) > 100 CM || isinf (o[a]) || isnan (o[a])) { programming_error ("Improbable offset for translation: setting to zero"); @@ -61,7 +61,7 @@ Molecule::translate (Offset o) incr (a); } - expr_ = gh_list (ly_symbol2scm ("translate-molecule"), + expr_ = scm_list_n (ly_symbol2scm ("translate-molecule"), ly_offset2scm (o), expr_, SCM_UNDEFINED); if (!empty_b ()) @@ -82,7 +82,7 @@ Molecule::translate_axis (Real x,Axis a) void Molecule::add_molecule (Molecule const &m) { - expr_ = gh_list (ly_symbol2scm ("combine-molecule"), + expr_ = scm_list_n (ly_symbol2scm ("combine-molecule"), m.expr_, expr_, SCM_UNDEFINED); dim_.unite (m.dim_); @@ -107,6 +107,9 @@ Molecule::set_empty (bool e) void Molecule::align_to (Axis a, Direction d) { + if (empty_b()) + return ; + Interval i (extent (a)); Real r = (d == CENTER) ? i.center () : i[d]; translate_axis (-r, a); @@ -132,114 +135,143 @@ Molecule::add_at_edge (Axis a, Direction d, Molecule const &m, Real padding) add_molecule (toadd); } +LY_DEFINE(ly_set_molecule_extent_x,"ly-set-molecule-extent!", 3 , 0, 0, + (SCM mol, SCM axis, SCM np), + "Set the extent (@var{extent} must be a pair of numbers) of @var{mol} in +@var{axis} direction (0 or 1 for x- and y-axis respectively). - - -bool -number_pair_p (SCM p) +Note that an extent @code{(A . B)} is an interval and hence @code{A} is +smaller than @code{B}, and is often negative. +5") { - return gh_pair_p (p) && gh_number_p (gh_car (p)) && gh_number_p (gh_cdr (p)); -} + Molecule* m = unsmob_molecule (mol); + SCM_ASSERT_TYPE (m, mol, SCM_ARG1, __FUNCTION__, "molecule"); + SCM_ASSERT_TYPE (ly_axis_p(axis), axis, SCM_ARG2, __FUNCTION__, "axis"); + SCM_ASSERT_TYPE (ly_number_pair_p (np), np, SCM_ARG3, __FUNCTION__, "number pair"); -bool -axis_p (SCM a) -{ - return gh_number_p (a) && (gh_scm2int (a) == 0 || gh_scm2int (a) == 1); -} + Interval iv = ly_scm2interval (np); + m->dim_[Axis (gh_scm2int (axis))] = iv; -SCM -Molecule::ly_set_molecule_extent_x (SCM mol, SCM axis, SCM np) -{ - Molecule* m = unsmob_molecule (mol); - if (m && axis_p (axis) && number_pair_p (np)) - { - Interval iv = ly_scm2interval (np); - m->dim_[Axis (gh_scm2int (axis))] = ly_scm2interval (np); - } - else - warning ("ly-set-molecule-extent!: invalid arguments"); return SCM_UNDEFINED; } -SCM -Molecule::ly_get_molecule_extent (SCM mol, SCM axis) +LY_DEFINE(ly_get_molecule_extent, + "ly-get-molecule-extent", 2 , 0, 0, (SCM mol, SCM axis), + "Return a pair of numbers signifying the extent of @var{mol} in +@var{axis} direction (0 or 1 for x and y axis respectively). +") { Molecule *m = unsmob_molecule (mol); + SCM_ASSERT_TYPE (m, mol, SCM_ARG1, __FUNCTION__, "molecule"); + SCM_ASSERT_TYPE (ly_axis_p(axis), axis, SCM_ARG2, __FUNCTION__, "axis"); - if (!m || !axis_p (axis)) - { - warning ("ly-get-molecule-extent: invalid arguments"); - return ly_interval2scm (Interval (0,0)); - } - return ly_interval2scm (m->extent (Axis (gh_scm2int (axis)))); } -SCM -Molecule::ly_molecule_combined_at_edge (SCM first, SCM axis, SCM direction, - SCM second, SCM padding) +LY_DEFINE(ly_molecule_combined_at_edge, + "ly-combine-molecule-at-edge", + 5 , 0, 0, (SCM first, SCM axis, SCM direction, + SCM second, SCM padding), + "Construct a molecule by putting @var{second} next to +@var{first}. @var{axis} can be 0 (x-axis) or 1 (y-axis), @var{direction} can be +-1 (left or down) or 1 (right or up). @var{padding} specifies extra +space to add in between measured in global staff space.") { Molecule * m1 = unsmob_molecule (first); Molecule * m2 = unsmob_molecule (second); Molecule result; - - if (!m1 || !m2 || !isdir_b (direction) || !axis_p (axis) || !gh_number_p (padding)) - { - warning ("ly-combine-molecule-at-edge: invalid arguments"); - Molecule r; - return r.smobbed_copy (); - } - result = *m1; - result.add_at_edge (Axis (gh_scm2int (axis)), Direction (gh_scm2int (direction)), - *m2, gh_scm2double (padding)); + SCM_ASSERT_TYPE(ly_axis_p(axis), axis, SCM_ARG2, __FUNCTION__, "axis"); + SCM_ASSERT_TYPE(ly_dir_p (direction), direction, SCM_ARG3, __FUNCTION__, "dir"); + SCM_ASSERT_TYPE(gh_number_p(padding), padding, SCM_ARG4, __FUNCTION__, "number"); + + if (m1) + result = *m1; + if (m2) + result.add_at_edge (Axis (gh_scm2int (axis)), Direction (gh_scm2int (direction)), + *m2, gh_scm2double (padding)); return result.smobbed_copy (); } +/* + FIXME: support variable number of arguments " + */ +LY_DEFINE(ly_add_molecule , + "ly-add-molecule", 2, 0,0,(SCM first, SCM second), + "Combine two molecules." + ) +{ + Molecule * m1 = unsmob_molecule (first); + Molecule * m2 = unsmob_molecule (second); + Molecule result; -SCM -make_molecule (SCM expr, SCM xext, SCM yext) + + if (m1) + result = *m1; + if (m2) + result.add_molecule (*m2); + + return result.smobbed_copy (); +} + +LY_DEFINE(ly_make_molecule, + "ly-make-molecule", 3, 0, 0, (SCM expr, SCM xext, SCM yext), + "") { - /* - TODO: typechecking. - */ + SCM_ASSERT_TYPE (ly_number_pair_p (xext), xext, SCM_ARG2, __FUNCTION__, "number pair"); + SCM_ASSERT_TYPE (ly_number_pair_p (yext), yext, SCM_ARG3, __FUNCTION__, "number pair"); + Box b (ly_scm2interval (xext), ly_scm2interval(yext)); Molecule m (b, expr); return m.smobbed_copy (); } +SCM +fontify_atom (Font_metric * met, SCM f) +{ + if (f == SCM_EOL) + return f; + else + return scm_list_n (ly_symbol2scm ("fontify"), + ly_quote_scm (met->description_), f, SCM_UNDEFINED); +} + +LY_DEFINE(ly_fontify_atom,"ly-fontify-atom", 2, 0, 0, + (SCM met, SCM f), + "Add a font selection command for the font metric @var{met} to @var{f}.") +{ + SCM_ASSERT_TYPE(unsmob_metrics (met), met, SCM_ARG1, __FUNCTION__, "font metric"); -static void -molecule_init () + return fontify_atom (unsmob_metrics (met), f); +} +LY_DEFINE(ly_align_to_x,"ly-align-to!", 3, 0, 0, (SCM mol, SCM axis, SCM dir), + "Align @var{mol} using its own extents.") { - scm_make_gsubr ("ly-make-molecule", 3, 0, 0, (Scheme_function_unknown) make_molecule); - scm_make_gsubr ("ly-combine-molecule-at-edge", 5 , 0, 0, (Scheme_function_unknown) Molecule::ly_molecule_combined_at_edge); - scm_make_gsubr ("ly-set-molecule-extent!", 3 , 0, 0, (Scheme_function_unknown) Molecule::ly_set_molecule_extent_x); - scm_make_gsubr ("ly-get-molecule-extent", 2 , 0, 0, (Scheme_function_unknown) Molecule::ly_get_molecule_extent); + SCM_ASSERT_TYPE(unsmob_molecule (mol), mol, SCM_ARG1, __FUNCTION__, "molecule"); + SCM_ASSERT_TYPE(ly_axis_p(axis), axis, SCM_ARG2, __FUNCTION__, "axis"); + SCM_ASSERT_TYPE(ly_dir_p (dir), dir, SCM_ARG3, __FUNCTION__, "dir"); + + unsmob_molecule (mol)->align_to ((Axis)gh_scm2int (axis), Direction (gh_scm2int (dir))); + + return SCM_UNDEFINED; } -ADD_SCM_INIT_FUNC (molecule,molecule_init); + +/* + Hmm... maybe this is not such a good idea ; stuff can be empty, + while expr_ == '() + */ bool Molecule::empty_b () const { return expr_ == SCM_EOL; } -SCM -fontify_atom (Font_metric * met, SCM f) -{ - if (f == SCM_EOL) - return f; - else - return gh_list (ly_symbol2scm ("fontify"), - ly_quote_scm (met->description_), f, SCM_UNDEFINED); -} - SCM Molecule::get_expr () const { @@ -257,13 +289,14 @@ IMPLEMENT_SIMPLE_SMOBS (Molecule); int -Molecule::print_smob (SCM s, SCM port, scm_print_state *) +Molecule::print_smob (SCM , SCM port, scm_print_state *) { - Molecule *r = (Molecule *) gh_cdr (s); - scm_puts ("#str ()); - scm_puts ((char *)str.ch_C (), port);*/ +#if 0 + Molecule *r = (Molecule *) ly_cdr (s); + String str (r->str ()); + scm_puts ((char *)str.ch_C (), port); +#endif scm_puts (" >", port); return 1; @@ -273,11 +306,11 @@ Molecule::print_smob (SCM s, SCM port, scm_print_state *) SCM Molecule::mark_smob (SCM s) { - Molecule *r = (Molecule *) gh_cdr (s); + Molecule *r = (Molecule *) ly_cdr (s); return r->expr_; } IMPLEMENT_TYPE_P (Molecule, "molecule?"); IMPLEMENT_DEFAULT_EQUAL_P (Molecule); -IMPLEMENT_UNSMOB (Molecule, molecule); +