X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Finclude%2Fmolecule.hh;h=a8a342527917d9c539ccb484f0e45e4b0d568790;hb=9943c08d29026b5a582e15d661c9a0d0b5e37501;hp=d1057bebf0d6a317219fbeddb8452148ebfa658b;hpb=6a62932652940f4ac2931f75d48796887fbc5fdc;p=lilypond.git diff --git a/lily/include/molecule.hh b/lily/include/molecule.hh index d1057bebf0..a8a3425279 100644 --- a/lily/include/molecule.hh +++ b/lily/include/molecule.hh @@ -1,37 +1,96 @@ +/* + molecule.hh -- declare Molecule + + source file of the GNU LilyPond music typesetter + + (c) 1997--2001 Han-Wen Nienhuys +*/ #ifndef MOLECULE_HH #define MOLECULE_HH +#include // size_t #include "lily-proto.hh" -#include "plist.hh" -#include "boxes.hh" - +#include "box.hh" +#include "axes.hh" +#include "direction.hh" +#include "lily-guile.hh" +#include "smobs.hh" /** a group of individually translated symbols. You can add molecules - to the top, to the right, etc. */ -struct Molecule { - Pointer_list ats; // change to List? + 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 + ; + + SCHEME is a Scheme expression that --when eval'd-- produces the + desired output. - /* *************** */ + + Because of the way that Molecule is implemented, it is the most + efficient to add "fresh" molecules to what you're going to build. - Molecule() { } - Molecule(Atom const &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 translate(Real,Axis); - void add(Atom const & a) ; - /// how big is #this#? - Box extent() const; - - String TeX_string() const; - - Molecule(const Molecule&s); - void print() const; -private: - void operator=(const Molecule&); + 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 { + 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); + 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); + + Interval extent (Axis) const; + Box extent_box () const; + /** + codify THIS into a Scheme expression. + */ + SCM create_scheme () const; + bool empty_b () const; + + + 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); }; + + +Molecule *unsmob_molecule (SCM); +SCM fontify_atom (Font_metric*, SCM atom); + +Molecule create_molecule (SCM brew_molecule); + + + #endif