]> git.donarmstrong.com Git - lilypond.git/blob - lily/include/score-element.hh
51893560cc6222f9c07bf073c7f00fcba7e7f9be
[lilypond.git] / lily / include / score-element.hh
1 /*
2   score-element.hh -- declare Score_element
3
4   (c) 1996-1999--2000 Han-Wen Nienhuys
5 */
6
7 #ifndef STAFFELEM_HH
8 #define STAFFELEM_HH
9
10 #include "parray.hh"
11 #include "virtual-methods.hh"
12 #include "lily-guile.hh"
13 #include "lily-proto.hh"
14 #include "smobs.hh"
15 #include "dimension-cache-callback.hh"
16
17
18
19
20
21 /**
22     for administration of what was done already
23     */
24 enum Score_element_status {
25   ORPHAN=0,                     // not yet added to pstaff
26   VIRGIN,                       // added to pstaff
27   PRECALCING,
28   PRECALCED,            // calcs before spacing done
29   POSTCALCING,          // busy calculating. This is used to trap cyclic deps.
30   POSTCALCED,           // after spacing calcs done
31   BREWING,
32   BREWED,
33 };
34
35 typedef void (Score_element::*Score_element_method_pointer) (void);
36
37 /**
38    Basic output object.
39
40     Element Properties:
41
42    transparent -- boolean: if true, do not print anything black.
43
44    dependencies -- list of score-element pointers that indicate who to
45    compute first.
46
47    interfaces -- list of symbols indicating the interfaces supported
48    by this object.
49
50    extra-offset -- pair of reals (a cons) forcing an extra offset
51    before outputting
52
53    glyph -- afm character name to output.
54    
55 */
56 class Score_element  {
57   /**
58      The lookup, determined by the font size. Cache this value.
59    */
60   Lookup * lookup_l_;
61 public:
62   /**
63      properties specific for this element. Destructor will not call
64      scm_unprotect, so as to allow more flexible GC arrangements.  The
65      real alist is in (cdr element_property_alist_), to reduce the
66      need for more scm_protect calls.
67
68   */
69   SCM element_property_alist_;
70   
71   Score_element *original_l_;
72
73   /**
74     Administration: Where are we?. This is mainly used by Super_element and
75     Score_element::calcalute_dependencies ()
76
77     0 means ORPHAN,
78     -1 means deleted
79     
80    */
81   int status_i_;
82
83   Paper_score *pscore_l_;
84
85   Score_element ();
86   Score_element (Score_element const&);
87   virtual void print () const;
88
89   /*
90     properties
91    */
92   SCM get_elt_property (String nm) const;
93   void set_elt_property (String, SCM val);
94
95   /**
96      UGH! JUNKME ?
97
98      This gets messy because it changes state
99
100      calling 
101
102      Bar::proc ()
103      {
104        s->remove_elt_property ("foo")
105      } 
106
107      twice may do weird things if Bar::foo has a default set.
108      
109    */
110   SCM remove_elt_property (String nm);
111
112   void Score_element::set_real (String, Real);
113   Real Score_element::get_real (String s) const;
114
115   /*
116     related classes.
117    */
118   Paper_def *paper_l () const;
119   Lookup const *lookup_l () const;
120
121   void add_processing ();
122
123   /**
124     add a dependency. It may be the 0 pointer, in which case, it is ignored.
125     */
126   void add_dependency (Score_element*);    
127   virtual Line_of_score * line_l () const;
128   bool linked_b () const;
129   VIRTUAL_COPY_CONS(Score_element);
130  
131   /**
132      Recursively track all dependencies of this Score_element.  The
133      status_i_ field is used as a mark-field.  It is marked with
134      #busy# during execution of this function, and marked with #final#
135      when finished.
136
137      #funcptr# is the function to call to update this element.
138    */
139   void calculate_dependencies (int final, int busy, Score_element_method_pointer funcptr);
140
141   static SCM handle_broken_smobs (SCM, SCM criterion);
142   void recurse_into_smobs (SCM s, void (Score_element::*meth_ptr)());
143
144   virtual void do_break_processing ();
145   virtual Score_element *find_broken_piece (Line_of_score*) const;
146   /// generate rods & springs
147   virtual void do_space_processing ();
148   virtual void do_breakable_col_processing ();
149
150   /// do calculations before determining horizontal spacing
151   virtual void before_line_breaking ();
152
153 protected:
154
155   /**
156     Junk score element. This is protected because this is supposed to
157     be handled by GUILE gc.  */
158   virtual ~Score_element ();
159   
160   virtual void output_processing ();
161   static Interval molecule_extent (Dimension_cache const*);
162
163   /// do printing of derived info.
164   virtual void do_print () const;
165   /// generate the molecule    
166   virtual Molecule do_brew_molecule () const;
167   ///executed directly after the item is added to the Paper_score
168   virtual void do_add_processing ();
169
170   /// do calculations after determining horizontal spacing
171   virtual void after_line_breaking ();
172     
173   static Interval dim_cache_callback (Dimension_cache const*);
174 public:
175   static SCM ly_set_elt_property (SCM, SCM,SCM);
176   static SCM ly_get_elt_property (SCM, SCM);  
177   
178   virtual void handle_broken_dependencies ();
179   virtual void handle_prebroken_dependencies ();
180
181
182   DECLARE_SMOBS;
183
184   void init ();
185
186 public:
187   Dimension_cache *dim_cache_[NO_AXES];
188
189   /**
190      Set this if anyone points to me, or if I point to anyone.
191
192      JUNKME.
193    */
194   bool used_b_;
195   
196   char const * name () const;
197   /**
198      Set empty in direction A.
199    */
200   void set_empty (Axis a);
201   bool empty_b (Axis a) const;
202   Interval extent (Axis) const;
203  
204   /**
205     translate in one direction
206     */
207     
208   void translate_axis (Real, Axis);
209
210   Real relative_coordinate (Score_element const* refp, Axis) const;
211   /**
212     Find the group-element which has both #this# and #s#
213    */
214   Score_element*common_refpoint (Score_element const* s, Axis a) const;
215   Score_element*common_refpoint (Link_array<Score_element> elems, Axis a) const;
216
217
218   bool has_offset_callback_b (Offset_cache_callback, Axis)const;
219   void add_offset_callback (Offset_cache_callback, Axis);
220   /**
221      Set the  parent refpoint of THIS to E
222    */
223   void set_parent (Score_element* e, Axis);
224   
225   Score_element *parent_l (Axis a) const;
226   void fixup_refpoint ();
227 };
228
229 Score_element * unsmob_element (SCM);
230
231
232
233 #endif // STAFFELEM_HH
234