+/*
+ molecule.hh -- declare Molecule
+
+ source file of the GNU LilyPond music typesetter
+
+ (c) 1997--2000 Han-Wen Nienhuys <hanwen@cs.uu.nl>
+*/
#ifndef MOLECULE_HH
#define MOLECULE_HH
-#include "proto.hh"
-#include "plist.hh"
-#include "boxes.hh"
-#include "symbol.hh"
+#include <stdlib.h> // size_t
+#include "lily-proto.hh"
+#include "box.hh"
+#include "axes.hh"
+#include "direction.hh"
+#include "lily-guile.hh"
-/// a symbol which can be translated, and freely copied
-struct Atom {
- Offset off;
- Symbol sym;
+/** a group of individually translated symbols. You can add molecules
+ to the top, to the right, etc.
- /* *************** */
-
- void translate(Offset o) {
- off += o;
- }
-
- /// how big is #this#?
- Box extent() const;
- Atom(Symbol s);
+ It is implemented as a "tree" of scheme expressions, as in
- void print() const;
+ Expr = combine Expr Expr
+ | translate Offset Expr
+ | SCHEME
+ ;
- String TeXstring() const;
-};
+ SCHEME is a Scheme expression that --when eval'd-- produces the
+ desired output.
-/** a group of individually translated symbols. You can add molecules
- to the top, to the right, etc. */
-struct Molecule {
- IPointerList<Atom*> ats; // change to List<Atom>?
+ 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)
- Molecule() { }
- Molecule(Atom a) { add(a) ; }
-
- void add_right(const Molecule &m);
- void add_left(const Molecule &m);
- void add_top(const Molecule &m);
- void add_bottom(const Molecule &m);
- void add(Molecule const &m);
- void translate(Offset);
- void add(Atom a) { ats.bottom().add(new Atom(a)); }
- /// how big is #this#?
- Box extent() const;
-
- String TeXstring() const;
-
- Molecule(const Molecule&s);
- void print() const;
-private:
- void operator=(const Molecule&);
+*/
+class Molecule {
+ /// can't alloc on heap.
+ void * operator new (size_t s);
+public:
+ Box dim_;
+ SCM expr_;
+
+ Molecule (Box, SCM s);
+ Molecule();
+
+ /**
+ 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);
+ void add_molecule (Molecule const &m);
+ void translate (Offset);
+
+ /**
+ align D direction in axis A.
+
+ If D == CENTER, then move the dimension(A).center() to (0,0)
+
+ Else, move so dimension(A)[D] == 0.0
+
+ */
+ void align_to (Axis a, Direction d);
+ void translate_axis (Real,Axis);
+
+
+
+ /// how big is #this#?
+ Box extent() const;
+ Interval extent (Axis) const;
+ bool empty_b() const;
+ void print ()const;
};
#endif