source file of the GNU LilyPond music typesetter
- (c) 1997--1999 Han-Wen Nienhuys <hanwen@cs.uu.nl>
+ (c) 1997--2004 Han-Wen Nienhuys <hanwen@cs.uu.nl>
*/
#ifndef MOLECULE_HH
#define MOLECULE_HH
+#include <stdlib.h> // size_t
#include "lily-proto.hh"
-#include "plist.hh"
#include "box.hh"
#include "axes.hh"
#include "direction.hh"
-#include "protected-scm.hh"
-#include "cons.hh"
-
-//#define ATOM_SMOB
+#include "lily-guile.hh"
+#include "smobs.hh"
/** a group of individually translated symbols. You can add molecules
- to the top, to the right, etc. */
-class Molecule {
-#ifdef ATOM_SMOB
- SCM atom_list_;
-#else
- // Protected_scm atom_list_; // change to List<Atom>?
- Cons<Atom> *atom_list_;
-#endif
- friend class Paper_outputter;
-public:
- Box dim_;
+ to the top, to the right, etc.
+
+ It is implemented as a "tree" of scheme expressions, as in
+
+ Expr = combine Expr Expr
+ | translate Offset Expr
+ | SCHEME
+ ;
- Molecule();
- ~Molecule();
+ SCHEME is a Scheme expression that --when eval'd-- produces the
+ desired output.
- void add_at_edge (Axis a, Direction d, const Molecule &m, Real padding);
+
+ Because of the way that Molecule is implemented, it is the most
+ efficient to add "fresh" molecules to what you're going to build.
+
+ Dimension behavior:
+
+ Empty molecules have empty dimensions. If add_at_edge is used to
+ init the molecule, we assume that
+ DIMENSIONS = (Interval (0,0),Interval (0,0)
+*/
+class Molecule
+{
+ friend SCM ly_molecule_set_extent_x (SCM, SCM, SCM);
+
+ Box dim_;
+ SCM expr_;
+ DECLARE_SIMPLE_SMOBS (Molecule,);
+public:
+ Molecule (Box, SCM s);
+ Molecule ();
+
+
+ SCM smobbed_copy () const;
+ SCM get_expr () const;
+
+ /**
+ Set dimensions to empty, or to (Interval (0,0),Interval (0,0) */
+ void set_empty (bool);
+ void add_at_edge (Axis a, Direction d, const Molecule &m, Real padding,
+ Real minimum);
void add_molecule (Molecule const &m);
void translate (Offset);
- void do_center (Axis);
+ void align_to (Axis a, Real x);
void translate_axis (Real,Axis);
- void add_atom (Atom const *a);
- /// how big is #this#?
- Box extent() const;
Interval extent (Axis) const;
+ Box extent_box () const;
+ /**
+ codify THIS into a Scheme expression.
+ */
+ SCM create_scheme () const;
+ bool is_empty () const;
+
- Molecule (const Molecule&s);
- void print() const;
- void operator=(const Molecule&);
+ static SCM ly_get_molecule_extent (SCM mol, SCM axis);
+ static SCM ly_set_molecule_extent_x (SCM,SCM,SCM);
+ static SCM ly_molecule_combined_at_edge (SCM,SCM,SCM,SCM,SCM);
};
+
+
+DECLARE_UNSMOB(Molecule,molecule);
+SCM fontify_atom (Font_metric const*, SCM atom);
+
+Molecule create_molecule (SCM brew_molecule);
+
+
+
#endif