]> git.donarmstrong.com Git - lilypond.git/blob - lily/graphical-element.cc
release: 1.2.12
[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--1999 Han-Wen Nienhuys <hanwen@cs.uu.nl>
7 */
8
9 #include "dimension-cache.hh"
10 #include "graphical-element.hh"
11 #include "graphical-axis-group.hh"
12 #include "debug.hh"
13
14 Graphical_element::Graphical_element ()
15 {
16   dim_cache_[X_AXIS] = new Dimension_cache;
17   dim_cache_[Y_AXIS] = new Dimension_cache;
18   used_b_ = false;
19   init ();
20 }
21
22 Graphical_element::Graphical_element (Graphical_element const &s)
23 {
24   dim_cache_[X_AXIS] = new Dimension_cache (*s.dim_cache_[X_AXIS]);
25   dim_cache_[Y_AXIS] = new Dimension_cache (*s.dim_cache_[Y_AXIS]);
26
27   used_b_ = true;
28   init ();
29
30
31 void
32 Graphical_element::init ()
33 {
34   dim_cache_[X_AXIS]->elt_l_ = dim_cache_[Y_AXIS]->elt_l_ = this;  
35 }
36
37
38 void
39 Graphical_element::translate_axis (Real y, Axis a)
40 {
41   dim_cache_[a]->translate (y);
42 }  
43
44 Real
45 Graphical_element::relative_coordinate (Graphical_element const*e, Axis a) const
46 {
47   return dim_cache_[a]->relative_coordinate (e ? e->dim_cache_[a] : 0);
48 }
49
50 Graphical_element * 
51 Graphical_element::common_refpoint (Graphical_element const* s, Axis a) const
52 {
53   return  (dim_cache_[a]->common_refpoint (s->dim_cache_[a])) ->element_l ();
54 }
55
56 void
57 Graphical_element::translate (Offset offset)
58 {
59   translate_axis (offset[Y_AXIS], Y_AXIS);
60   translate_axis (offset[X_AXIS], X_AXIS);
61 }
62
63
64 void
65 Graphical_element::set_empty (bool b, Axis a1, Axis a2)
66 {
67   if (a1 != NO_AXES)
68     dim_cache_[a1]->set_empty (b);
69   if (a2 != NO_AXES)
70     dim_cache_[a2]->set_empty (b);
71 }
72
73 /**
74    Return true if empty in both A1  direction and A2 dir.
75  */
76 bool
77 Graphical_element::empty_b (Axis a)
78 {
79   return dim_cache_[a]->empty_b ();
80 }
81
82 Interval
83 Graphical_element::extent (Axis a) const
84 {
85   Dimension_cache const * d = dim_cache_[a];
86
87   if (d->empty_b ())
88     return Interval ();
89   
90   return d->get_dim ();
91 }
92
93
94 void
95 Graphical_element::do_print () const
96 {
97 #ifndef NPRINT
98   DEBUG_OUT << '\n';
99 #endif
100 }
101
102 void
103 Graphical_element::invalidate_cache (Axis a)
104 {
105   dim_cache_[a]->invalidate ();
106 }
107
108 Graphical_element*
109 Graphical_element::parent_l (Axis a) const
110 {
111   Dimension_cache*d= dim_cache_[a]->parent_l_;
112   return d ? d->elt_l_ : 0;
113 }
114
115 Graphical_element::~Graphical_element ()
116 {
117   delete dim_cache_[X_AXIS];
118   delete dim_cache_[Y_AXIS];  
119 }
120
121 Graphical_element *
122 Graphical_element::common_refpoint (Link_array<Graphical_element> gs, Axis a) const
123 {
124   Dimension_cache * common = dim_cache_[a];
125   for (int i=0; i < gs.size (); i++)
126     {
127       common = common->common_refpoint (gs[i]->dim_cache_[a]);
128     }
129
130   return common->element_l ();
131 }
132
133 char const *
134 Graphical_element::name () const
135 {
136   return classname (this);
137 }
138
139 void
140 Graphical_element::print () const
141 {
142 #ifndef NPRINT
143   DEBUG_OUT << classname (this) << "{\n";
144   do_print ();
145   DEBUG_OUT << "}\n";
146 #endif
147 }  
148
149 void
150 Graphical_element::set_parent (Graphical_element *g, Axis a)
151 {
152   dim_cache_[a]->parent_l_ = g ? g->dim_cache_[a]: 0;
153 }