]> git.donarmstrong.com Git - lilypond.git/blob - lily/molecule.cc
release: 1.1.33
[lilypond.git] / lily / molecule.cc
1 /*
2   molecule.cc -- implement Molecule
3
4   source file of the GNU LilyPond music typesetter
5
6   (c)  1997--1999 Han-Wen Nienhuys <hanwen@cs.uu.nl>
7 */
8
9 #include "interval.hh"
10 #include "string.hh"
11 #include "molecule.hh"
12 #include "atom.hh"
13 #include "debug.hh"
14
15 #include "killing-cons.tcc"
16
17 #ifdef ATOM_SMOB
18 #define MOL_EOL SCM_EOL
19 #define NEXT_CELL(a) SCM_CDR(a)
20 #define CELLTYPE SCM
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)
25 #else
26 #define MOL_EOL 0
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_
31 #define BOX_ATOM(a) a
32 #define NEWCELL(a,b) new Killing_cons<Atom>(a,b)
33 #endif
34
35 Box
36 Molecule::extent() const
37 {
38   return dim_;
39 }
40
41 Interval
42 Molecule::extent(Axis a) const
43 {
44   return dim_[a];
45 }
46
47 void
48 Molecule::translate (Offset o)
49 {
50   for (CELLTYPE ptr = atom_list_; ptr != MOL_EOL; ptr = NEXT_CELL(ptr))
51     {
52       UNBOX_ATOM(UNBOX_PTR(ptr))->off_ += o;
53     }
54   dim_.translate (o);
55 }
56
57 void
58 Molecule::translate_axis (Real x,Axis a)
59 {
60   for (CELLTYPE  ptr = atom_list_; ptr != MOL_EOL; ptr = NEXT_CELL(ptr))
61     UNBOX_ATOM (UNBOX_PTR(ptr))->off_[a] += x;
62
63   dim_[a] += x;
64 }
65
66 void
67 Molecule::add_molecule (Molecule const &m)
68 {
69   for (CELLTYPE  ptr = m.atom_list_; ptr != MOL_EOL; ptr = NEXT_CELL(ptr))
70     add_atom(UNBOX_ATOM (UNBOX_PTR(ptr)));
71   
72   dim_.unite (m.dim_);
73 }
74
75 void
76 Molecule::add_atom (Atom const *al)
77 {
78   Atom *a = new Atom(*al);
79
80   atom_list_ = NEWCELL(BOX_ATOM(a), atom_list_);
81 }
82
83
84
85
86 void
87 Molecule::operator=(Molecule const & src)
88 {
89   if (&src == this)
90   return;
91
92
93
94 #ifndef ATOM_SMOB
95   delete atom_list_;
96 #endif
97
98   atom_list_ = MOL_EOL;
99   dim_= src.dim_;
100   add_molecule (src);
101 }
102
103 Molecule::Molecule (Molecule const &s)
104 {
105   atom_list_ = MOL_EOL;
106   add_molecule (s);
107 }
108
109 Molecule::~Molecule ()
110 {
111 #ifndef ATOM_SMOB
112   delete atom_list_;
113 #endif
114 }
115
116 void
117 Molecule::print() const
118 {
119 #ifndef NPRINT
120   if (! check_debug)
121     return;
122   DOUT << "dim:";
123   for (Axis i=X_AXIS; i < NO_AXES; incr (i))
124     DOUT << axis_name_str (i) << " = " << dim_[i].str ();
125 #endif
126 }
127
128 void
129 Molecule::do_center (Axis a)
130 {
131   Interval i (extent (a));
132   translate_axis (-i.center (), a);
133 }
134
135 Molecule::Molecule ()
136 {
137   dim_ = Box (Interval(0,0),Interval( 0,0  ));
138   atom_list_ = MOL_EOL;
139 }
140
141
142 void
143 Molecule::add_at_edge (Axis a, Direction d, Molecule const &m, Real padding)
144 {
145   Real my_extent= dim_[a][d];
146   
147   Real offset = my_extent -  m.extent ()[a][-d];
148   Molecule toadd (m);
149   toadd.translate_axis (offset + d * padding, a);
150   add_molecule (toadd);
151 }