]> git.donarmstrong.com Git - lilypond.git/blob - lily/graphical-element.cc
release: 1.1.28
[lilypond.git] / lily / graphical-element.cc
1 /*
2   graphical-element.cc -- implement Graphical_element
3
4   source file of the GNU LilyPond music typesetter
5
6   (c)  1997--1998 Han-Wen Nienhuys <hanwen@cs.uu.nl>
7 */
8
9 #include "graphical-element.hh"
10 #include "graphical-axis-group.hh"
11 #include "debug.hh"
12
13 bool
14 Graphical_element::empty_b () const
15 {
16   return dim_cache_[X_AXIS].empty_b () && dim_cache_[Y_AXIS].empty_b ();
17 }
18
19 Graphical_element::Graphical_element ()
20 {
21   init ();
22 }
23
24 Graphical_element::Graphical_element (Graphical_element const &s)
25   : dim_cache_ (s.dim_cache_)
26 {
27   init ();
28
29
30 void
31 Graphical_element::init ()
32 {
33   dim_cache_[X_AXIS].elt_l_ = dim_cache_[Y_AXIS].elt_l_ = this;  
34 }
35
36 Real
37 Graphical_element::absolute_coordinate (Axis a) const
38 {
39   return dim_cache_[a].absolute_coordinate ();
40 }
41  
42
43 Offset
44 Graphical_element::absolute_offset() const
45 {
46   return Offset (absolute_coordinate (X_AXIS), absolute_coordinate (Y_AXIS));
47 }
48
49
50
51 void
52 Graphical_element::translate_axis (Real y, Axis a)
53 {
54   dim_cache_[a].translate (y);
55 }  
56
57 Real
58 Graphical_element::relative_coordinate (Dimension_cache*e, Axis a) const
59 {
60   return dim_cache_[a].relative_coordinate (e);
61 }
62
63 Dimension_cache * 
64 Graphical_element::common_group (Graphical_element const* s, Axis a) const
65 {
66   return dim_cache_[a].common_group (&s->dim_cache_[a]);
67 }
68
69 void
70 Graphical_element::translate (Offset offset)
71 {
72   translate_axis (offset[Y_AXIS], Y_AXIS);
73   translate_axis (offset[X_AXIS], X_AXIS);
74 }
75
76
77 void
78 Graphical_element::set_empty (bool b)
79 {
80   dim_cache_[X_AXIS].set_empty (b);
81   dim_cache_[Y_AXIS].set_empty (b);
82 }
83
84 Interval
85 Graphical_element::extent (Axis a) const
86 {
87   Dimension_cache const * d = &dim_cache_[a];
88
89   if (d->empty_b ())
90     return Interval ();
91   
92   if (!d->valid_b ())
93     ((Dimension_cache*)d)->set_dim  ((a == X_AXIS)? do_width(): do_height ());
94   
95
96   return d->get_dim ();
97 }
98
99 void
100 Graphical_element::unlink ()
101 {
102   for (int a=X_AXIS; a < NO_AXES; a++)
103     if (Dimension_cache * d = dim_cache_[a].parent_l_)
104       {
105         if (Graphical_axis_group * eg
106             = dynamic_cast<Graphical_axis_group*> (d->elt_l_))
107           eg->remove_element (this);
108       }
109 }
110
111 void
112 Graphical_element::junk_links ()
113 {
114 }
115
116 void
117 Graphical_element::do_print () const
118 {
119 #ifndef NPRINT
120   DOUT << '\n';
121 #endif
122 }
123
124
125
126 void
127 Graphical_element::invalidate_cache (Axis a)
128 {
129   dim_cache_[a].invalidate ();
130 }
131
132 Graphical_element*
133 Graphical_element::parent_l (Axis a) const
134 {
135   Dimension_cache*d= dim_cache_[a].parent_l_;
136   return d ? d->elt_l_ : 0;
137 }
138
139 Graphical_element::~Graphical_element ()
140 {
141 }
142
143 Dimension_cache *
144 Graphical_element::common_group (Link_array<Graphical_element> gs, Axis a) const
145 {
146   Dimension_cache * common = &dim_cache_[a];
147   for (int i=0; i < gs.size (); i++)
148     {
149       common = common->common_group (&gs[i]->dim_cache_[a]);
150     }
151
152   return common;
153 }
154
155 char const *
156 Graphical_element::name () const
157 {
158   return classname (this);
159 }