+ Molecule * m1 = unsmob_molecule (first);
+ Molecule * m2 = unsmob_molecule (second);
+ Molecule result;
+
+
+ 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 ();
+}
+
+
+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 ();
+}
+
+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);
+}
+
+SCM
+ly_fontify_atom (SCM met, SCM f)
+{
+ SCM_ASSERT_TYPE(unsmob_metrics (met), met, SCM_ARG1, __FUNCTION__, "font metric");
+
+ return fontify_atom (unsmob_metrics (met), f);
+}
+
+SCM
+ly_align_to_x (SCM mol, SCM axis, SCM dir)
+{
+ 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;
+}
+
+
+static void
+molecule_init ()
+{
+ scm_c_define_gsubr ("ly-make-molecule", 3, 0, 0, (Scheme_function_unknown) make_molecule);
+ scm_c_define_gsubr ("ly-fontify-atom", 2, 0, 0, (Scheme_function_unknown) ly_fontify_atom);
+ scm_c_define_gsubr ("ly-align-to!", 3, 0, 0, (Scheme_function_unknown) ly_align_to_x);
+ scm_c_define_gsubr ("ly-combine-molecule-at-edge", 5 , 0, 0, (Scheme_function_unknown) Molecule::ly_molecule_combined_at_edge);
+ scm_c_define_gsubr ("ly-set-molecule-extent!", 3 , 0, 0, (Scheme_function_unknown) Molecule::ly_set_molecule_extent_x);
+ scm_c_define_gsubr ("ly-get-molecule-extent", 2 , 0, 0, (Scheme_function_unknown) Molecule::ly_get_molecule_extent);
+}
+ADD_SCM_INIT_FUNC (molecule,molecule_init);
+
+
+bool
+Molecule::empty_b () const
+{
+ return expr_ == SCM_EOL;
+}
+
+SCM
+Molecule::get_expr () const
+{
+ return expr_;
+}
+
+
+
+Box
+Molecule::extent_box () const
+{
+ return dim_;
+}
+IMPLEMENT_SIMPLE_SMOBS (Molecule);
+
+
+int
+Molecule::print_smob (SCM s, SCM port, scm_print_state *)
+{
+
+ scm_puts ("#<Molecule ", port);
+#if 0
+ Molecule *r = (Molecule *) ly_cdr (s);
+ String str (r->str ());
+ scm_puts ((char *)str.ch_C (), port);