2 molecule.cc -- implement Molecule
4 source file of the GNU LilyPond music typesetter
6 (c) 1997--1999 Han-Wen Nienhuys <hanwen@cs.uu.nl>
11 #include "molecule.hh"
15 #include "killing-cons.tcc"
18 #define MOL_EOL SCM_EOL
19 #define NEXT_CELL(a) SCM_CDR(a)
21 #define UNBOX_ATOM(a) Atom::atom_l (a)
22 #define BOX_ATOM(a) a->make_smob ()
23 #define NEWCELL(a,b) gh_cons (a,b)
24 #define UNBOX_PTR(a) SCM_CAR(a)
27 #define NEXT_CELL(a) ptr->next_
28 #define CELLTYPE Cons<Atom>*
29 #define UNBOX_ATOM(a) a
30 #define UNBOX_PTR(a) a->car_
32 #define NEWCELL(a,b) new Killing_cons<Atom>(a,b)
36 Molecule::extent() const
42 Molecule::extent(Axis a) const
48 Molecule::translate (Offset o)
50 for (CELLTYPE ptr = atom_list_; ptr != MOL_EOL; ptr = NEXT_CELL(ptr))
52 UNBOX_ATOM(UNBOX_PTR(ptr))->off_ += o;
58 Molecule::translate_axis (Real x,Axis a)
60 for (CELLTYPE ptr = atom_list_; ptr != MOL_EOL; ptr = NEXT_CELL(ptr))
61 UNBOX_ATOM (UNBOX_PTR(ptr))->off_[a] += x;
67 Molecule::add_molecule (Molecule const &m)
69 for (CELLTYPE ptr = m.atom_list_; ptr != MOL_EOL; ptr = NEXT_CELL(ptr))
70 add_atom(UNBOX_ATOM (UNBOX_PTR(ptr)));
76 Molecule::add_atom (Atom const *al)
78 Atom *a = new Atom(*al);
80 atom_list_ = NEWCELL(BOX_ATOM(a), atom_list_);
87 Molecule::operator=(Molecule const & src)
103 Molecule::Molecule (Molecule const &s)
105 atom_list_ = MOL_EOL;
109 Molecule::~Molecule ()
117 Molecule::print() const
123 for (Axis i=X_AXIS; i < NO_AXES; incr (i))
124 DOUT << axis_name_str (i) << " = " << dim_[i].str ();
129 Molecule::do_center (Axis a)
131 Interval i (extent (a));
132 translate_axis (-i.center (), a);
135 Molecule::Molecule ()
137 dim_ = Box (Interval(0,0),Interval( 0,0 ));
138 atom_list_ = MOL_EOL;
143 Molecule::add_at_edge (Axis a, Direction d, Molecule const &m, Real padding)
145 Real my_extent= dim_[a][d];
147 Real offset = my_extent - m.extent ()[a][-d];
149 toadd.translate_axis (offset + d * padding, a);
150 add_molecule (toadd);