]> git.donarmstrong.com Git - lilypond.git/blob - lily/skyline-pair.cc
Restore some directories for the documentation build
[lilypond.git] / lily / skyline-pair.cc
1 /*
2   This file is part of LilyPond, the GNU music typesetter.
3
4   Copyright (C) 2008--2012 Han-Wen Nienhuys <hanwen@lilypond.org>
5
6
7   LilyPond is free software: you can redistribute it and/or modify
8   it under the terms of the GNU General Public License as published by
9   the Free Software Foundation, either version 3 of the License, or
10   (at your option) any later version.
11
12   LilyPond is distributed in the hope that it will be useful,
13   but WITHOUT ANY WARRANTY; without even the implied warranty of
14   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15   GNU General Public License for more details.
16
17   You should have received a copy of the GNU General Public License
18   along with LilyPond.  If not, see <http://www.gnu.org/licenses/>.
19 */
20
21 #include "skyline-pair.hh"
22
23 #include "international.hh"
24 #include "ly-smobs.icc"
25
26 Skyline_pair::Skyline_pair ()
27   : skylines_ (Skyline (DOWN), Skyline (UP))
28 {
29 }
30
31 Skyline_pair::Skyline_pair (vector<Box> const &boxes, Axis a)
32   : skylines_ (Skyline (boxes, a, DOWN), Skyline (boxes, a, UP))
33 {
34 }
35
36 Skyline_pair::Skyline_pair (vector<Drul_array<Offset> > const &buildings, Axis a)
37   : skylines_ (Skyline (buildings, a, DOWN), Skyline (buildings, a, UP))
38 {
39 }
40
41 Skyline_pair::Skyline_pair (vector<Skyline_pair> const &skypairs)
42   : skylines_ (Skyline (skypairs, DOWN), Skyline (skypairs, UP))
43 {
44 }
45
46 Skyline_pair::Skyline_pair (Box const &b, Axis a)
47   : skylines_ (Skyline (b, a, DOWN), Skyline (b, a, UP))
48 {
49 }
50
51 void
52 Skyline_pair::raise (Real r)
53 {
54   skylines_[UP].raise (r);
55   skylines_[DOWN].raise (r);
56 }
57
58 void
59 Skyline_pair::deholify ()
60 {
61   skylines_[UP].deholify ();
62   skylines_[DOWN].deholify ();
63 }
64
65 void
66 Skyline_pair::shift (Real r)
67 {
68   skylines_[UP].shift (r);
69   skylines_[DOWN].shift (r);
70 }
71
72 void
73 Skyline_pair::insert (Box const &b, Axis a)
74 {
75   skylines_[UP].insert (b, a);
76   skylines_[DOWN].insert (b, a);
77 }
78
79 Real
80 Skyline_pair::left () const
81 {
82   return min (skylines_[UP].left (), skylines_[DOWN].left ());
83 }
84
85 Real
86 Skyline_pair::right () const
87 {
88   return max (skylines_[UP].right (), skylines_[DOWN].right ());
89 }
90
91 // This function comes with the same caveats as smallest_shift:
92 // if the skylines are not contiguous, we may report false
93 // intersections.
94 bool
95 Skyline_pair::intersects (Skyline_pair const &other) const
96 {
97   return skylines_[UP].distance (other[DOWN]) > 0
98          && other[UP].distance (skylines_[DOWN]) > 0;
99 }
100
101 Real
102 Skyline_pair::smallest_shift (Skyline_pair const &other, Direction d,
103                               Real h_pad, Real v_pad)
104 {
105   // If skylines_[UP] avoids other[DOWN] or skylines_[DOWN] avoids
106   // other[UP] then we will not intersect.
107   // Note that this is not guaranteed to return the smallest shift
108   // if one Skyline_pair is not connected: the smallest_shift left
109   // in the case of
110   // AAA
111   // BBBBBB
112   //    AAA
113   // will result in
114   //    AAA
115   // BBBBBB
116   //       AAA
117   // even though the originals did not collide.  If it becomes necessary,
118   // this case could be handled by splitting the Skyline_pairs up into
119   // their connected components.
120
121   return d * min (d * skylines_[UP].smallest_shift (other[DOWN], d, h_pad, v_pad),
122                   d * skylines_[DOWN].smallest_shift (other[UP], d, h_pad, v_pad));
123 }
124
125 void
126 Skyline_pair::merge (Skyline_pair const &other)
127 {
128   skylines_[UP].merge (other[UP]);
129   skylines_[DOWN].merge (other[DOWN]);
130 }
131
132 void
133 Skyline_pair::print () const
134 {
135   skylines_[UP].print ();
136   skylines_[DOWN].print ();
137 }
138
139 void
140 Skyline_pair::print_points () const
141 {
142   skylines_[UP].print_points ();
143   skylines_[DOWN].print_points ();
144 }
145
146 bool
147 Skyline_pair::is_empty () const
148 {
149   return skylines_[UP].is_empty ()
150          && skylines_[DOWN].is_empty ();
151 }
152
153 bool
154 Skyline_pair::is_singleton () const
155 {
156   return skylines_[UP].is_singleton ()
157          && skylines_[DOWN].is_singleton ();
158 }
159
160 Skyline &
161 Skyline_pair::operator [] (Direction d)
162 {
163   return skylines_[d];
164 }
165
166 Skyline const &
167 Skyline_pair::operator [] (Direction d) const
168 {
169   return skylines_[d];
170 }
171
172 IMPLEMENT_SIMPLE_SMOBS (Skyline_pair);
173 IMPLEMENT_TYPE_P (Skyline_pair, "ly:skyline-pair?");
174 IMPLEMENT_DEFAULT_EQUAL_P (Skyline_pair);
175
176 SCM
177 Skyline_pair::mark_smob (SCM)
178 {
179   return SCM_EOL;
180 }
181
182 int
183 Skyline_pair::print_smob (SCM s, SCM port, scm_print_state *)
184 {
185   Skyline_pair *r = (Skyline_pair *) SCM_CELL_WORD_1 (s);
186   (void) r;
187
188   scm_puts ("#<Skyline-pair>", port);
189   return 1;
190 }
191
192 MAKE_SCHEME_CALLBACK (Skyline_pair, skyline, 2);
193 SCM
194 Skyline_pair::skyline (SCM smob, SCM dir_scm)
195 {
196   Skyline_pair *sp = Skyline_pair::unsmob (smob);
197   Direction dir = robust_scm2dir (dir_scm, UP);
198
199   if (dir == CENTER)
200     {
201       warning (_f ("direction must not be CENTER in ly:skyline-pair::skyline"));
202       dir = UP;
203     }
204
205   return (*sp)[dir].smobbed_copy ();
206 }