X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fmolecule.cc;h=af60d58ab4ccf50948e39be0bd9ba0dfee17fbdc;hb=aa76d0de152265e9913d7dc67c4fd8d923aec04b;hp=b414b498aea0720c03ea41bcc13d06a173fe55b3;hpb=dafefd1a631edf07e3c1873cfcea6285bde1200c;p=lilypond.git diff --git a/lily/molecule.cc b/lily/molecule.cc index b414b498ae..af60d58ab4 100644 --- a/lily/molecule.cc +++ b/lily/molecule.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2001 Han-Wen Nienhuys + (c) 1997--2003 Han-Wen Nienhuys */ #include @@ -14,8 +14,8 @@ #include "interval.hh" #include "string.hh" #include "molecule.hh" -#include "debug.hh" -#include "killing-cons.tcc" +#include "warn.hh" + #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,13 +107,20 @@ 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); } +/* + See scheme Function. + */ void -Molecule::add_at_edge (Axis a, Direction d, Molecule const &m, Real padding) +Molecule::add_at_edge (Axis a, Direction d, Molecule const &m, Real padding, + Real minimum) { Real my_extent= empty_b () ? 0.0 : dim_[a][d]; Interval i (m.extent (a)); @@ -126,106 +133,27 @@ Molecule::add_at_edge (Axis a, Direction d, Molecule const &m, Real padding) else his_extent = i[-d]; - Real offset = my_extent - his_extent; + Real offset = (my_extent - his_extent) + d*padding; + if (minimum > 0 && fabs (offset) < minimum) + offset = sign (offset) * minimum; + Molecule toadd (m); - toadd.translate_axis (offset + d * padding, a); + toadd.translate_axis (offset, a); add_molecule (toadd); } -/* ly_? Thought we had the ly_ prefix for wrapping/adding to gh_ */ -SCM -Molecule::ly_set_molecule_extent_x (SCM mol, SCM axis, SCM np) -{ - Molecule* m = unsmob_molecule (mol); - if (m && ly_axis_p (axis) && ly_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) -{ - Molecule *m = unsmob_molecule (mol); - - if (!m || !ly_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) - -{ - Molecule * m1 = unsmob_molecule (first); - Molecule * m2 = unsmob_molecule (second); - Molecule result; - - if (!m1 || !m2 || !isdir_b (direction) || !ly_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)); - - return result.smobbed_copy (); -} - - -SCM -make_molecule (SCM expr, SCM xext, SCM yext) -{ - /* - TODO: typechecking. - */ - Box b (ly_scm2interval (xext), ly_scm2interval(yext)); - Molecule m (b, expr); - return m.smobbed_copy (); -} - - -static void -molecule_init () -{ - 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); -} -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 { @@ -243,13 +171,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 string (r->to_string ()); + scm_puts ((char *)str.to_str0 (), port); +#endif scm_puts (" >", port); return 1; @@ -259,11 +188,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_TYPE_P (Molecule, "ly:molecule?"); IMPLEMENT_DEFAULT_EQUAL_P (Molecule); -IMPLEMENT_UNSMOB (Molecule, molecule); +