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