]> git.donarmstrong.com Git - lilypond.git/blob - lily/dimension-cache.cc
release: 1.1.18
[lilypond.git] / lily / dimension-cache.cc
1 /*   
2   dimension-cache.cc --  implement Dimension_cache
3   
4   source file of the GNU LilyPond music typesetter
5   
6   (c) 1998 Han-Wen Nienhuys <hanwen@cs.uu.nl>
7  */
8
9 #include "dimension-cache.hh"
10 #include "parray.hh"
11
12 Dimension_cache::Dimension_cache (Dimension_cache const &d)
13 {
14   init();
15   empty_b_ = d.empty_b_;
16 }
17
18 Dimension_cache::Dimension_cache ()
19 {
20   init();
21 }
22
23 void
24 Dimension_cache::init()
25 {
26   offset_ =0.0;
27   elt_l_ = 0;
28   dim_.set_empty ();
29   parent_l_ =0;
30   valid_b_ = false;
31   empty_b_ = false;
32 }
33
34
35 void
36 Dimension_cache::invalidate ()
37 {
38   valid_b_ = false;
39   invalidate_dependencies ();
40 }
41
42 void
43 Dimension_cache::invalidate_dependencies ()
44 {
45   for (int i=0; i < dependencies_l_arr_.size (); i++)
46     {
47       Dimension_cache * g = dependencies_l_arr_[i];
48       if (g->valid_b_)
49         {
50           g->invalidate ();
51         }
52     }
53 }
54
55 void
56 Dimension_cache::set_offset (Real x)
57 {
58   invalidate_dependencies ();
59   offset_ = x;
60 }
61
62 void
63 Dimension_cache::translate (Real x)
64 {
65   invalidate_dependencies ();
66   offset_ += x;
67 }
68
69
70 Real
71 Dimension_cache::absolute_coordinate () const
72 {
73   Real r = offset_;
74   for (Dimension_cache * c = parent_l_;
75        c; c = c->parent_l_)
76     r += c->offset_;
77   return r;
78 }
79
80 Real
81 Dimension_cache::relative_coordinate (Dimension_cache *d) const
82 {
83   Real r =0.0;
84
85   for (Dimension_cache* c = parent_l_;
86        c != d;
87        c = c->parent_l_)
88     r +=  c->offset_;
89   return r;
90 }
91
92 Dimension_cache *
93 Dimension_cache::common_group (Dimension_cache const* s) const
94 {
95   Link_array<Dimension_cache const> my_groups;
96   for (Dimension_cache const *c = this;
97        c ; c = c->parent_l_)
98     my_groups.push (c);
99   
100   
101   Dimension_cache const *common=0;
102   
103   for (Dimension_cache const * d = s;
104        !common && d;
105        d = d->parent_l_)
106     common = my_groups.find_l (d);
107
108   return (Dimension_cache*)common;
109 }
110
111
112
113 void
114 Dimension_cache::set_empty (bool b)
115 {
116   if (empty_b_ != b)
117     {
118       empty_b_ = b;
119       if (!empty_b_)
120         invalidate ();
121     }
122 }  
123
124 void
125 Dimension_cache::set_dim (Interval v)
126 {
127   dim_ = v;
128   valid_b_ = true;
129 }
130   
131
132 Interval
133 Dimension_cache::get_dim () const
134 {
135   Interval r;
136   if (empty_b_)
137     {
138       r.set_empty ();
139       return r;
140     }
141       
142   assert (valid_b_);
143
144   r=dim_;
145   if (!r.empty_b()) // float exception on DEC Alpha
146     r += offset_;
147
148   return r;
149 }
150
151